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.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Swipl DCG does not appear to function

salamander-eng opened this issue · comments

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 ?

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).