PROLOG的事实是双边的吗?

时间:2018-03-26 11:24:58

标签: prolog

所以我刚刚开始编程PROLOG(SWI发行版)。我有很好的逻辑基础,我熟悉事实,规则,量化和所有词汇。

据我所知,您可以定义一个事实,例如:

married(a,b).

我知道如果您进行如下查询:

?: married(X,b).

答案是“a”。我的问题是,如果我想制定一个使用先前声明的事实的规则,它会认为“a与b结婚”,但它是否会认为“b与a结婚”或者我是否必须声明另一个事实像:

married(b,a).

让它起作用?对于任何可以表现为事实的双边关系都是如此。

1 个答案:

答案 0 :(得分:5)

你的意思是关系是自动对称的吗?然后没有 - 假设你有一个带有edge(a,b)的有向图,那么你不希望推断出另一个方向edge(b,a)。那么,大于2的arity的关系呢?

您始终可以创建谓词的对称闭包:

r_sym(X,Y) :-
  r(X,Y).
r_sym(X,Y) :-
  r(Y,X).

使用新的谓词名称可防止无限派生链r(X,Y) -> r(Y,X) -> r(X,Y) -> ....