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

From: Jay McCarthy (jay.mccarthy at gmail.com)
Date: Thu Jul 17 15:31:26 EDT 2014

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.