Некоторые общие замечания: обратите внимание, что этот код строго определен c для SWI. В других системах, соответствующих ISO, вы можете получить доступ к определениям только через clause/2
, если этот предикат имеет значение dynamic
.
Для SWI скажите listing.
, чтобы увидеть, что происходит.
?- assert(( thing :- A = 1 )).
true.
?- listing(thing).
:- dynamic thing/0.
thing.
true.
?- assert(( thing :- p(A) = p(1) )).
true.
?- assert(( thing(X) :- Y = 2 )).
true.
?- listing(thing).
:- dynamic thing/0.
thing.
thing :-
p(_)=p(1).
:- dynamic thing/1.
thing(_).
true.
Все это похоже на небольшую оптимизацию на уровне источника.