在 prolog 中表示关于信念的真相

Representing truth regarding beliefs in prolog

如何使这个(或类似的东西)在 Prolog 中工作:

belief(john,red(apple)).
belief(peter,red(apple)).
X :- belief(john,X), belief(peter,X).

并为以下查询获取 true.(在咨询上述内容时):-

?- red(apple).

首先,当所有(相关)人都相信某事时,定义一个小帮手来捕捉是有用的:

all_believe(Belief) :-
    belief(john, Belief),
    belief(peter, Belief).

然后你可以定义,例如:

red(Object) :-
    all_believe(red(Object)).

green(Object) :-
    all_believe(green(Object)).

根据你给定的信念,你会得到:

?- red(apple).
true.

?- green(apple).
false.

这行得通。它要求您为要用作信念的任何术语定义类似的规则。

您可以使用 term_expansion:

的宏定义使其更短一些
term_expansion(declare_belief(Belief),
               Belief :- all_believe(Belief)).

这意味着您的源代码中的每个顶级定义 declare_belief(Belief) 都应该被视为您已经编写了 Belief :- all_believe(Belief) (适当地替换了变量 Belief ).

所以现在你可以这样写:

declare_belief(red(_)).
declare_belief(green(_)).

并且它的处理方式与上面 red(Object)red(Object) 的较长定义完全相同。对于您想要用作可能信念的任何术语,您仍然必须编写此类声明。

Prolog 不允许规则的 head 只是一个变量。头部必须是一个 nonvar 项,其仿函数(即名称和元数)标识正在定义的谓词。所以,一个可能的解决方案是这样的:

true_belief(X) :-
  belief(john,  X),
  belief(peter, X).

belief(john,  red(apple)).
belief(peter, red(apple)).

示例:

?- true_belief(red(apple)).
true.

?- true_belief(X).
X = red(apple).