Я пробовал это как hello
, но я думаю, что это не работает.
kng_bck(1).
kng_bck(2).
kng_bck(3).
:- dynamic(p/1).
hello :- kng_bck(X), p(X).
% true if p(1). p(2). and p(3). are all defined,
% that is for every true value of kng_bck(X), p(X) is
also true.
Вместо этого попробуйте использовать следующее определение hello
:
hello :- \+ (kng_bck(X), \+ p(X)).
Затем следующий запрос должен вернуть true:
?- assert(p(1)), assert(p(2)), assert(p(3)), hello.
\+/1 истинно, когда цель не может быть доказана, поэтому это определение hello
проверяет наличие нет ситуации, когда «kng_bck(X)
и нетp(X)
».
Обновление на основе отзывов в комментариях:
Вы также можете добиться этого, используя Форалл/2. Пример:
?- assert(p(1)), assert(p(2)), assert(p(3)), forall(kng_bck(X), p(X)).
Я думаю, что есть и forall, который решил мою проблему, можете ли вы включить это в свой ответ.