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

Jeff Thompson jeff at thefirst.org
Fri Jan 13 10:45:50 AEDT 2012

On 1/9/2012 11:15 PM, Jeff Thompson 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).

I'm still struggling with this one. I set pred test to the "fast 
version" which tests "X > 2" which fails and does not throw an 
exception. A benchmark with 10,000,000 calls to this takes only 0.45 
seconds. (Awesome!)

When I set the test back to "X > 0" where it throws the exception, the 
benchmark takes 171 seconds.  That's 380 times as long.  This is what 
"message passing with exceptions is inefficient" means.  It really 
hurts.  Is there no help to be gotten from the compiler?

Thanks for any help,
- Jeff

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