[racket] [racket-users]Is Racklog suitable to learn Prolog? A simple example just fails.

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Thu Jul 17 16:39:15 EDT 2014

Mea cupla. 



On Jul 17, 2014, at 3:31 PM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:

> Matthias,
> 
> Racklog did generate a stream of solutions, but WarGrey's program
> iterates through them all by calling (answer (%more)).
> 
> I also recommend kanren, though.
> 
> Jay
> 
> On Fri, Jul 4, 2014 at 2:47 AM, Matthias Felleisen <matthias at ccs.neu.edu> wrote:
>> 
>> Racklog should have generated a stream of solutions here. That's my problem
>> with it. -- Matthias
>> 
>> 
>> 
>> 
>> 
>> On Jul 4, 2014, at 5:37 AM, Scott Moore wrote:
>> 
>> I'm not sure what behavior you were expecting for this program. Under
>> standard prolog semantics (goal-directed) this program will yield infinitely
>> many solutions, so this may not be a bug in racklog but rather in the
>> program.
>> 
>> That said, Matthias is probably right that using a currently maintained
>> package is probably a good idea.
>> 
>> Cheers,
>> Scott
>> 
>> 
>> On Thu, Jul 3, 2014 at 7:46 PM, WarGrey Gyoudmon Ju <juzhenliang at gmail.com>
>> wrote:
>>> 
>>> Okay, Thank you.
>>> 
>>> 
>>> On Fri, Jul 4, 2014 at 1:21 AM, Matthias Felleisen <matthias at ccs.neu.edu>
>>> wrote:
>>>> 
>>>> 
>>>> Yes, I corrected your program and ran into this bug.
>>>> 
>>>> Try to use Kanren instead of Racklog. It isn't completely a legacy
>>>> package but I doubt we can get a quick fix here.
>>>> 
>>>> -- Matthias
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On Jul 3, 2014, at 4:53 PM, WarGrey Gyoudmon Ju wrote:
>>>> 
>>>> Sorry, my example is not correct.
>>>> But this one still does not work:
>>>> 
>>>> #lang at-exp racket
>>>> 
>>>> (require racklog)
>>>> 
>>>> (define %edge
>>>>  (%rel ()
>>>>    [('a 'b)]
>>>>    [('b 'c)]
>>>>    [('c 'd)]
>>>>    [('d 'a)]))
>>>> 
>>>> (define %path
>>>>  (%rel (X Y Z)
>>>>    [(X Y) (%edge X Y)]
>>>>    [(X Y) (%edge X Z) (%path Z Y)]))
>>>> 
>>>> (let answer ([r (%which (X Y) (%path X Y))])
>>>>  (printf "~a --> ~a~n" (cdar r) (cdadr r))
>>>>  (answer (%more)))
>>>> 
>>>> This version also will not terminate.
>>>> 
>>>> On Thu, Jul 3, 2014 at 9:04 PM, Matthias Felleisen <matthias at ccs.neu.edu>
>>>> wrote:
>>>>> 
>>>>> 
>>>>> If you want to learn Prolog, why not use a free Prolog implementation?
>>>> 
>>>> 
>>>> Simply speaking, Modern Prolog seems to cut the illumos-based SunOS off,
>>>> I cannot build it without headache and they does not answer me about this
>>>> issue.
>>>> So I wander if Racklog is a legacy package?
>>>> 
>>>>> 
>>>>> 
>>>>> If you want to learn about relational programming, use miniKanren, which
>>>>> is available of cKanren. Then you can also get to constraints. Maintainer
>>>>> cc-ed.
>>>>> 
>>>>> -- Matthias
>>>>> 
>>>>> 
>>>>> 
>>>>> On Jul 3, 2014, at 6:48 AM, WarGrey Gyoudmon Ju wrote:
>>>>> 
>>>>>> This example is rewritten from the datalog version.
>>>>>> 
>>>>>> #lang racket
>>>>>> 
>>>>>> (require racklog)
>>>>>> 
>>>>>> (define %edge
>>>>>>  (%rel ()
>>>>>>    [('a 'b)]
>>>>>>    [('b 'c)]
>>>>>>    [('c 'd)]
>>>>>>    [('d 'a)]))
>>>>>> 
>>>>>> (define %path
>>>>>>  (%rel (X Y)
>>>>>>    [(X Y) (%edge X Y)]
>>>>>>    [(X Y) (%edge X 'Z)
>>>>>>             (%path 'Z Y)]))
>>>>>> 
>>>>>> (%find-all (X Y) (%path X Y))
>>>>>> 
>>>>>> It only gives four results.
>>>>>> 
>>>>>> #lang racklog
>>>>>> 
>>>>>> edge(a, b).
>>>>>> edge(b, c).
>>>>>> edge(c, d).
>>>>>> edge(d, a).
>>>>>> 
>>>>>> path(X, Y) :- edge(X, Y).
>>>>>> path(X, Y) :- edge(X, Z), path(Z, Y).
>>>>>> 
>>>>>> path(X, Y)?
>>>>>> 
>>>>>> and this version will not terminate.
>>>>>> 
>>>>>> Thanks in advance.
>>>>>> ____________________
>>>>>> Racket Users list:
>>>>>> http://lists.racket-lang.org/users
>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> ____________________
>>>  Racket Users list:
>>>  http://lists.racket-lang.org/users
>>> 
>> 
>> 
>> 
>> ____________________
>>  Racket Users list:
>>  http://lists.racket-lang.org/users
>> 
> 
> 
> 
> -- 
> Jay McCarthy
> http://jeapostrophe.github.io
> 
>           "Wherefore, be not weary in well-doing,
>      for ye are laying the foundation of a great work.
> And out of small things proceedeth that which is great."
>                          - D&C 64:33



Posted on the users mailing list.