# [m-rev.] for review / comment: simplify code in solutions.m

Julien Fischer juliensf at csse.unimelb.edu.au
Tue Nov 30 22:59:36 AEDT 2010

```Hi,

I would like opinions as to whether the following diff constitutes an
acceptable abuse of the promise_equivalent_solutions mechanism.
(A similar change could be made to get_one_solution etc, in builtin.m
which would then remove the need for a bunch of foreign_procs.)

Julien.

-----------------

Branches: main

library/solutions.m:
Simplify the implementation of non_cc_call/{4,5}; in
particular avoid the construction of a closure.

Index: library/solutions.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/library/solutions.m,v
retrieving revision 1.8
diff -u -r1.8 solutions.m
--- library/solutions.m	30 Nov 2010 06:51:10 -0000	1.8
+++ library/solutions.m	30 Nov 2010 11:49:05 -0000
@@ -396,15 +396,15 @@
non_cc_call(P::pred(in, in, out) is det, X::in, !.Acc::in, !:Acc::out) :-
P(X, !Acc).
non_cc_call(P::pred(in, in, out) is cc_multi, X::in, !.Acc::in, !:Acc::out) :-
-    Pred = (pred(Soln::out) is cc_multi :-
-        P(X, !.Acc, Soln)
-    ),
-    impure !:Acc = builtin.get_one_solution(Pred).
+    promise_equivalent_solutions [!:Acc] (
+        P(X, !Acc),
+        impure impure_true
+    ).
non_cc_call(P::pred(in, di, uo) is cc_multi, X::in, !.Acc::di, !:Acc::uo) :-
-    Pred = (pred({}::out, !.Acc::di, !:Acc::uo) is cc_multi :-
-        P(X, !Acc)
-    ),
-    impure builtin.get_one_solution_io(Pred, _, !Acc).
+    promise_equivalent_solutions [!:Acc] (
+        P(X, !Acc),
+        impure impure_true
+    ).
non_cc_call(P::pred(in, di, uo) is det, X::in, !.Acc::di, !:Acc::uo) :-
P(X, !Acc).
non_cc_call(P::pred(mdi, di, uo) is det, X::mdi, !.Acc::di, !:Acc::uo) :-
@@ -421,14 +421,14 @@
!.Acc::di, !:Acc::uo) :-
P(X, More, !Acc).
non_cc_call(P::pred(in, out, in, out) is det, X::in, More::out,
-        Acc0::in, Acc::out) :-
-    P(X, More, Acc0, Acc).
+        !.Acc::in, !:Acc::out) :-
+    P(X, More, !Acc).
non_cc_call(P::pred(in, out, di, uo) is cc_multi, X::in, More::out,
!.Acc::di, !:Acc::uo) :-
-    Pred = (pred(M::out, !.Acc::di, !:Acc::uo) is cc_multi :-
-        P(X, M, !Acc)
-    ),
-    impure builtin.get_one_solution_io(Pred, More, !Acc).
+    promise_equivalent_solutions [More, !:Acc] (
+        P(X, More, !Acc),
+        impure impure_true
+    ).

:- type heap_ptr == private_builtin.heap_pointer.
:- type trail_ptr ---> trail_ptr(c_pointer).

--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au