[mercury-users] First solution in csharp without try/catch

Mark Brown mark at csse.unimelb.edu.au
Wed Jan 11 01:33:15 AEDT 2012


On 09-Jan-2012, Jeff Thompson <jeff at thefirst.org> wrote:
> On 1/8/2012 8:58 PM, Mark Brown wrote:
>> Hi Jeff,
>> On 06-Jan-2012, Jeff Thompson<jeff at thefirst.org>  wrote:
>>> Hello again.  I'm using the csharp grade to compile the following.
>>> :- pred multiPred(int::out) is multi.
>>> multiPred(1).
>>> multiPred(2).
>>> :- pred test is semidet.
>>> test :- if multiPred(X), X>  0 then true else fail.
>>> In pred test, in the if statement, when "multiPred(X), X>  0" first
>>> succeeds, the predicate succeeds, else fails.  The compiled C# code works
>>> correctly.  But the implementation throws a new runtime.Commit() 
>>> exception
>>> when it first succeeds, and catches this in an outer try/catch block (see
>>> below).  I can understand why the authors would have implemented it this
>>> way, but using exceptions for message passing in normal operation is very
>>> inefficient.
>>> Is there another way (where the implementation doesn't use try/catch) to
>>> make a semidet predicate which succeeds on the first solution of some 
>>> code
>>> block?
>> I don't think there is a more efficient solution, short of avoiding nondet
>> code to begin with (i.e., implement your own search in det/semidet code).
> Thanks for the feedback.  Can you say something more about the approach to 
> implement my own search?

Standard depth-first-search: keep a stack containing, at each level, the
search state and the unexplored choices; discard the stack once you've
found the solution(s) you want.

> Also, solutions.do_while in the library can "stop before all solutions have 
> been found".  Does it also use try/catch internally?

Not internally.  But do_while is cc_multi, so in a situation like yours it
will be enclosed in a commit, and the commit will use try/catch.


mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions:          mercury-users-request at csse.unimelb.edu.au

More information about the users mailing list