在swi prolog的子句中使用assertz

在swi prolog的子句中使用assertz,prolog,expert-system,Prolog,Expert System,我正在尝试在中制作专家系统示例的修改版本。我正在尝试修改它,以便能够执行以下操作: good_pet(X) :- bird(X), small(X). good_pet(X) :- cuddly(X), small(X). good_pet(X) :- cuddly(X), yellow(X). 如果small()或cuddly为真,则无需程序重新屏蔽。 我试着做: :- dynamic ([small/1, cuddly/1 ]). good_pet(X) :- bird(X), asser

我正在尝试在中制作专家系统示例的修改版本。我正在尝试修改它,以便能够执行以下操作:

good_pet(X) :- bird(X), small(X).
good_pet(X) :- cuddly(X), small(X).
good_pet(X) :- cuddly(X), yellow(X).
如果small()或cuddly为真,则无需程序重新屏蔽。
我试着做:

:- dynamic ([small/1, cuddly/1 ]).
good_pet(X) :- bird(X), assertz(small(X)).
good_pet(X) :- bird(X), small(X).
good_pet(X) :- assertz(cuddly(X)), assertz(small(X)).
good_pet(X) :- cuddly(X), small(X).
good_pet(X) :- cuddly(X), yellow(X).
如上所述。
但这最终导致了这个错误:

No permission to access private_procedure `assertz/1'
In:
   [4] clause(assertz(cuddly(tweety)),_1306)
   [3] prove(assertz(cuddly(tweety))) at  line 11
   [2] prove((assertz(...),assertz(...))) at  line 8
   [1] prove(good_pet(tweety)) at  line 12

是否有解决此错误的方法或任何其他方法来保存问题的结果?

您尝试使用的元解释器不考虑调用内置谓词(如
assertz/1
)的子句。尝试:

prove(true) :- !.
prove((B, Bs)) :- !,
    prove(B),
    prove(Bs).
prove(H) :-
    predicate_property(H, built_in),
    !,
    call(H).
prove(H) :-
    clause(H, B),
    prove(B).
prove(H) :-
    askable(H),
    writeln(H),
    read(Answer),
    Answer == yes.

你在使用SWISH online吗?@damianodamiano是的,我在使用在线版本。我现在没有权限调用沙盒“$current\u module”(\u 1440,\u 1442)”。这可能是因为我使用的是在线版本吗?@FrankRidder,这听起来像是个时髦的问题。您在代码中使用了模块吗?不,我没有使用标准示例中没有的任何东西。