【问题标题】:Use assertz while within a clause within swi-prolog在 swi-prolog 的子句中使用 assertz
【发布时间】:2020-06-22 19:15:31
【问题描述】:

我正在尝试在swi-prolog.org 中制作专家系统示例的修改版本。我正在尝试对其进行修改以使其能够做到:

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

here.
但这最终导致了这个错误:

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

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

【问题讨论】:

  • 您在线使用 SWISH 吗?
  • @damianodamiano 是的,我正在使用在线版本。

标签: prolog expert-system


【解决方案1】:

您尝试使用的元解释器不考虑调用内置谓词(如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.

【讨论】:

  • 我现在得到:没有权限调用沙盒 `'$current_module'(_1440,_1442)'。难道是因为我用的是网络版?
  • @FrankRidder 这听起来像是一个 SWISH 问题。您在代码中使用模块吗?
  • 不,我没有使用标准示例中没有的任何东西。
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多