2013-03-20 58 views
1

我相信这是相当基本的,虽然我无法通过搜索找到它。Prolog互惠规则

我学习序言和发现规则的一个例子:(代表邻接)

adj(1, 2). adj(2, 1). 
adj(1, 3). adj(3, 1). 
adj(3, 4). adj(4, 3). 

现在,这让我觉得有点浪费,因为我们知道邻居是一个此消彼长的关系,应该是足以定义每一对中的一个,然后定义:

adj(X, Y) :- 
    adj(Y, X), !. 

我明白为什么这种简单化的尝试不起作用;如果X和Y不相邻,它会陷入无限循环。但是,我还没有弄清楚如何修改它以适用于所有情况。

回答

3

你应该引入一个替代名称并使用它来编写你的逻辑。例如

adj(1, 2). 
adj(1, 3). 
adj(3, 4). 

is_adj(X,Y) :- adj(X,Y) ; adj(Y,X).