Используйте assertz, находясь в предложении в пределах swi-пролога - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь создать модифицированную версию примера экспертной системы в 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 имеет значение true.
Я попытался сделать:

:- 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

Есть ли решение этой ошибки или любой другой способ сохранить результат заданных вопросов?

1 Ответ

1 голос
/ 11 марта 2020

Мета-интерпретатор, который вы пытаетесь использовать, не учитывает предложения, которые вызывают встроенные предикаты, такие как 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.
...