This seems to have been enough for me to fix the problem.I'm about to push a fix. Although I'm not totally confident in my solution.
Basically, Racklog [1] compiles (%rel [arg-pattern subgoals ...] ...) into (let ([! fail-relation]) (%or (%and (unify args arg-pattern) subgoals ...) ...)) where ! is bound to the failure continuation that went into %or even though it appears inside of the subgoal part. So, Racklog was skipping the subsequent clauses of the relation, but it was not un-doing the unification of the current clause. I basically had to hack it so unify's failure continuation can be called by a subgoal and then the fact that a cut is happening is caught before going to the next clause... like: (define cut? #f) (%or (begin (when cut? (fail-relation)) (%and (unify args arg-pattern) (let ([! (lambda () (set! cut? #t) fail-unify)]) (%and subgoals ...)))) ...) This test case and all my existing ! test cases succeed... but I'm scared it doesn't really work. Any other ! puzzles would be appreciated. Jay 1. Racklog is based on schelog version 2003-06-01. This problem exists in that version of schelog too. I decided to check schelog's source: Matthias' original paper "Transliterating Prolog into Scheme" published in October 1985 (I was 4 months old when it was written... at least when it was published.) It appears that the same problem is there. On Mon, Aug 13, 2012 at 12:48 PM, Matthias Felleisen <matth...@ccs.neu.edu> wrote: > > The Prolog program looks like this (alpha renamed): > > a(X) :- b(X). > a(Z) :- c(Z). > b(1) :- !. > b(2). > c(2). > > 1. a(Y) unifies with [the head of] the first line, which gives us Y = X, and > b(Y) as the goal. > 2. b(Y) unifies with the third line, which gives us Y = 1. > 3. Solution found: 1 > 4. Reject solution. > 5. Backtracking on b fails due to prompt. > 6. Backtrack on 2 and therefore on 1. > 7. a(Y) unifies with the second line, which once again gives us Y = Z and > c(Y) as the goal. > 8. c(Y) unifies with the fourth line, which yields Y = 2. > > A cut is an exit continuation to the current relation that undoes local > bindings. > > -- Matthias > > > > > > On Aug 13, 2012, at 2:15 PM, Jay McCarthy wrote: > >> Can you help me understand this example and why x should be 2? My >> understanding of cut and prolog is that this should happen: >> >> a(X) [X = _ ] >> ----> >> b(X) ; c(X) [ X = _ ] >> ----> >> b(1) ; b(2); c(X) [ X = _ ] >> ----> >> X = 1; ! ; b(2) ; c(X) [ X = _ ] >> ----> >> ! ; b(2) ; c(X) [ X = 1 ] >> >> ! evaluates to succeed and then we get the X = 1 solution. >> >> But because we cut, the change to the X logic variable won't be >> undone, so when we try we get to... >> >> b(2) ; c(X) >> -----> >> 1 = 2 ; c(X) >> ----> >> fail ; c(X) >> ----> >> c(X) >> ----> >> c(2) >> -----> >> 1 = 2 >> ----> >> fail >> >> and never see that X = 2 >> >> I must be wrong because you show that prologs actually give 2, but >> could you help me see why? >> >> Jay >> >> On Sat, Aug 11, 2012 at 11:32 PM, Erik Dominikus >> <erik.dominiku...@gmail.com> wrote: >>> Racket version: >>> >>> 5.2. >>> >>> Output of 'uname -a': >>> >>> Linux kire 2.6.32-41-generic #91-Ubuntu SMP Wed Jun 13 11:43:55 UTC 2012 >>> x86_64 GNU/Linux >>> >>> Symptom: >>> >>> In SWI Prolog (or any Prolog interpreter I think), querying a(X) gives >>> X=1 and X=2. Racklog only gives x=1. >>> >>> How to reproduce: >>> >>> Download 'a.pl' (attached). >>> Run 'prolog -f a.pl' (if using SWI Prolog). >>> Enter 'a(X).'. >>> Press ';' (semicolon) key until it prints false. >>> >>> Download 'a.rkt' (attached). >>> Run 'racket a.rkt'. >>> >>> Expectation: >>> >>> Racklog gives x=1 and x=2. >>> >>> >>> Thank you. >>> >>> ____________________ >>> Racket Users list: >>> http://lists.racket-lang.org/users >>> >> >> >> >> -- >> Jay McCarthy <j...@cs.byu.edu> >> Assistant Professor / Brigham Young University >> http://faculty.cs.byu.edu/~jay >> >> "The glory of God is Intelligence" - D&C 93 >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users > -- Jay McCarthy <j...@cs.byu.edu> Assistant Professor / Brigham Young University http://faculty.cs.byu.edu/~jay "The glory of God is Intelligence" - D&C 93 ____________________ Racket Users list: http://lists.racket-lang.org/users