[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Understanding GNU vs SWI differences
From: |
Alberto Simões |
Subject: |
Re: Understanding GNU vs SWI differences |
Date: |
Fri, 10 Aug 2012 10:21:35 +0100 |
Hello, Daniel
Thank you for your explanation. It makes things easier to understand.
Cheers
Alberto
On Fri, Aug 10, 2012 at 8:08 AM, Daniel Diaz <address@hidden> wrote:
> Hi Alberto,
>
> when you press ; (semicolon) you ask the top-level to look for another
> solution. Maybe such a solution exists (it is then computed and displayed by
> the top-level) or maybe not (in that case the top-level informs the user
> about the failure). GNU Prolog tries to avoid to propose a ; to the user if
> it knows there is no remaining solution. This behavior as also been followed
> by SWI. Both systems detects there is no more solution depending on its
> internal state (in fact it checks if there remains at least one choice-point
> in its choice stack). For this GNU Prolog uses a clause indexing mechanism
> based on the first argument. For this reason it can detect that f(a,X) has
> only 2 solution (and does not propose a ;) while it cannot for f(X,b). Anyway
> this is a "plus", the answer is not wrong.
>
> SWI has adopted the same principle and also avoids to propose a ; if it knows
> there is no more solution. Simply its internal state is not the same as
> gprolog thus both systems do not detect the same situations.
>
> ?- sub_atom(abc,X,Y,Z,c).
> X = 2,
> Y = 1,
> Z = 0 ;
> false.
>
> You can see that SWI also answers 'false'.
>
> While gprolog detects there is no more solution and does not propose a ;
>
> | ?- sub_atom(abc,X,Y,Z,c).
>
> X = 2
> Y = 1
> Z = 0
>
> yes
>
>
> Daniel
>
>
> Le 7 août 2012 à 16:10, Alberto Simões a écrit :
>
>> Hello
>>
>> I am sorry if this is a trivial issue, that is explained somewhere. If
>> so, please point me in that direction.
>> Nevertheless, when doing some experiments with SWI Prolog and GNU
>> Prolog, I found out some different behavior on some simple things:
>>
>> This is my SWI Prolog run:
>>
>> ?- [user].
>> |: f(a,b).
>> |: f(c,d).
>> |: f(a,d).
>> |: % user://1 compiled 0.00 sec, 5 clauses
>> true.
>>
>> ?- f(X,b).
>> X = a.
>>
>> ?- f(a,X).
>> X = b ;
>> X = d.
>>
>> ?- f(X,d).
>> X = c ;
>> X = a.
>>
>> In fact, SWI Prolog never says true/false/yes/no. It just show the
>> possible results.
>>
>> In GNU Prolog I get this:
>>
>> | ?- [user].
>> compiling user for byte code...
>> f(a,b).
>> f(c,d).
>> f(a,d).
>>
>> user compiled, 4 lines read - 331 bytes written, 9192 ms
>>
>> yes
>> | ?- f(X,b).
>>
>> X = a ? ;
>>
>> no
>> | ?- f(a,X).
>>
>> X = b ? ;
>>
>> X = d
>>
>> yes
>> | ?- f(X,d).
>>
>> X = c ? ;
>>
>> X = a
>>
>> (1 ms) yes
>>
>> Although I can understand the 'yes' answer, I can't get why in the
>> first iteration GNU Prolog stopped and gave me the chance to ask for
>> more solutions (while in the next two it didn't). And, why did it say
>> "no" (ok, it said no because it didn't find any other solution, but
>> then, why did it try to get more solutions in that case?)
>>
>> Thank you
>> Kindest regards,
>> Alberto
>>
>> --
>> Alberto Simões
>>
>> _______________________________________________
>> Users-prolog mailing list
>> address@hidden
>> https://lists.gnu.org/mailman/listinfo/users-prolog
>>
>> --
>> Ce message a ete verifie par MailScanner
>> pour des virus ou des polluriels et rien de
>> suspect n'a ete trouve.
>>
>
>
> --
> Ce message a ete verifie par MailScanner
> pour des virus ou des polluriels et rien de
> suspect n'a ete trouve.
>
--
Alberto Simões