ichiban / prolog

The only reasonable scripting engine for Go.
MIT License
613 stars 29 forks source link

asserta/1 does not define new public predicate #309

Closed UWN closed 7 months ago

UWN commented 9 months ago

?- asserta(a(1,2)).     
true.
?- clause(a(X,Y),B).
2024/01/05 21:20:04 error(permission_error(access,private_procedure,a/2),clause/2), unexpected.
   X=1,Y=2,B=true. % expected, but not found
ichiban commented 9 months ago

Thank you for reporting this! I'll fix it later.

Note to self:

8.9.1.4 says asserta((foo(X) :- X, call(X))). has the same effect as:

:- dynamic(foo/1).
foo(X) :- call(X), call(X).

7.5.3 says "a dynamic procedure shall be public."

ichiban commented 7 months ago

fixed in v1.2.0.

$ go install github.com/ichiban/prolog/cmd/1pl@latest
go: downloading github.com/ichiban/prolog v1.2.0
$ $(go env GOPATH)/bin/1pl
Top level for ichiban/prolog v1.2.0
This is for testing purposes only!
See https://github.com/ichiban/prolog for more details.
Type Ctrl-C or 'halt.' to exit.
?- asserta(a(1,2)).
true.
?- clause(a(X,Y),B).
B = true,
X = 1,
Y = 2.
?-