在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,这听起来像是个时髦的问题。您在代码中使用了模块吗?不,我没有使用标准示例中没有的任何东西。