mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-23 05:13:48 +00:00
This first step deals with the consequences of such removal.
The removal itself will happen in stage 2. That step will
add "is" to the prolog module in the library.
compiler/add_pred.m:
Prepare for "is" being in the prolog module.
compiler/options.m:
Add a way to test whether the change to add_pred.m is in the
installed compiler.
tests/accumulator/base.m:
tests/accumulator/call_in_base.m:
tests/accumulator/chain.m:
tests/accumulator/commutative.m:
tests/accumulator/construct_test.m:
tests/accumulator/dcg.m:
tests/accumulator/deconstruct_test.m:
tests/accumulator/disj.m:
tests/accumulator/func.m:
tests/accumulator/heuristic.m:
tests/accumulator/highorder.m:
tests/accumulator/identity.m:
tests/accumulator/inter.m:
tests/accumulator/nonrec.m:
tests/accumulator/out_to_in.m:
tests/accumulator/qsort.m:
tests/accumulator/simple.m:
tests/accumulator/split.m:
tests/accumulator/swap.m:
tests/benchmarks/cqueens.m:
tests/benchmarks/crypt.m:
tests/benchmarks/deriv.m:
tests/benchmarks/deriv2.m:
tests/benchmarks/nrev.m:
tests/benchmarks/poly.m:
tests/benchmarks/primes.m:
tests/benchmarks/qsort.m:
tests/benchmarks/query.m:
tests/benchmarks/tak.m:
tests/debugger/interactive.m:
tests/declarative_debugger/Mercury.options:
tests/declarative_debugger/io_read_bug.m:
tests/declarative_debugger/queens.exp:
tests/declarative_debugger/queens.m:
tests/dppd/imperative_solve_impl.m:
tests/dppd/map_impl.m:
tests/dppd/max_length_impl.m:
tests/dppd/sum.m:
tests/dppd/upto_sum_impl.m:
tests/par_conj/dep_par_21.m:
tests/tabling/seq.m:
tests/term/dds3_14.m:
tests/term/mmatrix.m:
tests/term/money.m:
tests/term/occur.m:
tests/term/pl4_5_2.m:
tests/term/queens.m:
tests/typeclasses/inference_test.m:
tests/typeclasses/inference_test_2.m:
tests/valid/lazy_list.m:
tests/warnings/duplicate_const.m:
Replace calls to "is" with unifications. In many places,
bring programming style up to date.
63 lines
1.5 KiB
Mathematica
63 lines
1.5 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% Tests the case where the base case contains some goals which
|
|
% must be left in the base case of the introduced predicate.
|
|
%
|
|
|
|
:- module dcg.
|
|
|
|
:- interface.
|
|
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module list.
|
|
|
|
main(!IO) :-
|
|
io.write_string("p A: ", !IO),
|
|
p([1, 10, 100, 9, 0], ListA, [], ListB),
|
|
io.write_line(ListA, !IO),
|
|
io.write_string("p B: ", !IO),
|
|
io.write_line(ListB, !IO),
|
|
io.write_string("p2 A2: ", !IO),
|
|
p2([1, 10, 100, 9, 0], ListA2, [], ListB2),
|
|
io.write_line(ListA2, !IO),
|
|
io.write_string("p2 B2: ", !IO),
|
|
io.write_line(ListB2, !IO).
|
|
|
|
% We can introduce accumulators, but the DCG goals must be left
|
|
% in the base case of the accumulator version of the predicate.
|
|
%
|
|
:- pred p(list(T)::in, list(T)::out, list(T)::in, list(T)::out) is det.
|
|
|
|
p([], []) --> [].
|
|
p(X, Y) -->
|
|
{ X = [H | T] },
|
|
q(H),
|
|
p(T, T0),
|
|
{ list.append(T0, [H], Y) }.
|
|
|
|
% We cannot introduce accumulators because the second call to q
|
|
% can't be moved before p2.
|
|
%
|
|
:- pred p2(list(T)::in, list(T)::out, list(T)::in, list(T)::out) is det.
|
|
|
|
p2([], []) --> [].
|
|
p2(X, Y) -->
|
|
{ X = [H | T] },
|
|
q(H),
|
|
p2(T, T0),
|
|
q(H),
|
|
{ list.append(T0, [H], Y) }.
|
|
|
|
:- pred q(T::in, list(T)::in, list(T)::out) is det.
|
|
:- pragma no_inline(q/3).
|
|
|
|
q(H, DCG0, DCG) :-
|
|
DCG = [H | DCG0].
|