yuce / pyswip

PySwip is a Python - SWI-Prolog bridge enabling to query SWI-Prolog in your Python programs. It features an (incomplete) SWI-Prolog foreign language interface, a utility class that makes it easy querying with Prolog and also a Pythonic interface.
MIT License
464 stars 97 forks source link

Swipl DCG does not appear to function #131

Open salamander-eng opened 2 years ago

salamander-eng commented 2 years ago

This seems to work when a file is consulted, but does not appear to work when utilized via assert: Simplest possible example:

as --> []. as --> [a], as. ?- phrase(as,[a,a,X,a]). X = a.

If the DCG is described in a file and p.consult("dcgtest.pl") used, this works as expected:

for r in p.query("phrase(as,[a,X,a,a])"): print(r)

If we try to assert instead, things do not appear to be parsing correctly

p.assertz("as --> []") p.assertz("as --> [a], as")

yields

PrologError: Caused by: 'phrase(as,[a,X,a,a])'. Returned: 'error(existence_error(procedure, /(as, 2)), context(:($dcg, /(call_dcg, 3)), Variable(76)))'.

I need to generate and insert the DCG from the python side. Is there a way to accomplish this that I am not understanding ?

salamander-eng commented 2 years ago

Part of this issue is with the way that swipl implements assertz and will fail when tested against swipl using this construct. This could probably be fixed within pyswip by using the [user] pseudo file instead of asserta/asserz mechanism, but that seems a lot of work for a corner case.

To work around this problem use the dcg translation mechanism directly. To test the above code, try the construct

?- dcg_translate_rule((as --> []),T),assertz(T). ?- dcg_translate_rule((as --> [a], as),T),assertz(T). ?- phrase(as,X).