不对称的二元关系,我的代码不能正常工作

时间:2015-01-06 17:41:57

标签: prolog

这是我的代码:

binary_relations(x,y) .
binary_relations(y,z) .

asymmetric :-
  not(symmetric) .

symmetric :-
  binary_relations(X,Y) ,
  binary_relations(Y,X) .

一切都是真的,程序正在以良好的方式运作,但如果我写的话:

binary_relations(x,y).
binary_relations(y,y).
binary_relations(y,z).

程序错误。

我需要做的是你可以看到的非对称二元关系。有人帮忙吗?我怎么能弄清楚这种情况呢?

首先,你必须写:非对称。

1 个答案:

答案 0 :(得分:1)

考虑以下知识库,明确描述三个二元关系r1/2r2/2r3/3

r1(a,a).
r1(a,b).
r1(b,a).
r1(a,c).
r1(c,a).

r2(a,b).
r2(a,c).

r3(a,a).
r3(b,a).
r3(a,c).

很明显,r1/2是对称的,r2/2r3/2都是反对称的,r2/2是三者中唯一的不对称。

让我们尝试用自然语言表达,然后使用逻辑。如果两个对象RX使Y为真,但R(X,Y)为false,则关系R(Y,X)是对称的。

symmetric(R):-
    \+ (call(R, X, Y), \+ call(R, Y, X)).

如果没有两个对象(不一定是不同的),RR(X,Y)都是真的,则关系R(Y,X)是不对称的。

asymmetric(R):-
    \+ (call(R, X, Y), call(R, Y, X)).

第三,如果RR(X,Y)都为真,则R(Y,X)关系是反对称的,意味着XY是同一个实体(在其他中)单词:没有两个不同的对象XYR(X,Y)R(Y,X)都是真的。

antisymmetric(R):-
    \+ (call(R, X, Y), call(R, Y, X), Y \== X).

还有一些疑问:

?- symmetric(r1).
true.

?- symmetric(r2).
false.

?- symmetric(r3).
false.

?- asymmetric(r1).
false.

?- asymmetric(r2).
true.

?- asymmetric(r3).
false.

?- antisymmetric(r1).
false.

?- antisymmetric(r2).
true.

?- antisymmetric(r3).
true.