【发布时间】:2013-06-09 05:20:00
【问题描述】:
首先是上下文。我试图用 prolog 建模的是 两个单独的图表,都代表一群朋友,所以我可以在他们两个中放置关系 friend(X,Y),并且,因为在这个模型中没有意义友谊不是相互的,我也把关系friend(Y, X)。
这意味着两个图在其元素之间具有双向关系。
例如:
friend(foo1, foo2).
friend(foo2, foo1).
friend(foo3, foo4).
friend(foo4, foo3).
其中foo1与foo2相关,foo3和foo4也是如此,但前两个与后两个无关。
因为是一群朋友,所以在同一个朋友群里,同一个群里的两个人不是朋友也是没有意义的,所以我用递归来判断一个人是另一个人的朋友。
definitivefriend(X, Z) :- friend(X, Z).
definitivefriend(X, Z) :- friend(X, Y), definitivefriend(Y, Z).
我遇到的问题是当我尝试检查一个群体中的一个人是否是另一个群体中的一个人的朋友。换句话说,检查一个图的一个元素是否与另一个图的另一个元素相关。
编译器(在本例中为 SWI-Prolog)并没有得到错误,而是给出了一个超出本地堆栈的错误。
我想知道如何解决这个问题。
编辑
感谢 CapelliC,我有办法解决这个问题。因为主要目标已经完成,但是还有一个次要问题我从现在开始描述它。
这是我正在使用的两个图表。请记住,我之前说过,两个图都是双向的。
这是我在 prolog 中的程序:
writeit :- write('Frienship').
definitivefriend(X, Z) :- friend(X, Z), friend(Z, X).
definitivefriend(X, Y) :- friend(X, Z), X @< Z, definitivefriend(Z, Y), Y \= X.
friend(amanda, ryan). % graph1 %
friend(ryan, amanda).
friend(ryan, lisa).
friend(lisa, ryan).
friend(bryan, ryan).
friend(ryan, bryan).
friend(sara, ryan).
friend(ryan, sara).
friend(sara, simone).
friend(simone, sara). % graph2 %
friend(sandra, jeff).
friend(jeff, sandra).
friend(betty, jeff).
friend(jeff, betty).
friend(jeff, antonia).
friend(antonia, jeff).
friend(jeff, oskar).
friend(oskar, jeff).
friend(jeff, leslie).
friend(leslie, jeff).
这是我得到的一些输出
?- definitivefriend(amanda, ryan).
true . % It's correct, both nodes are neighbours %
?- definitivefriend(amanda, simone).
true . % It's correct, both nodes are in the same graph %
?- definitivefriend(ryan, simone).
true . % It's correct, same explanation as before %
?- definitivefriend(simone, amanda).
false. % It's wrong, expected result is true %
?- definitivefriend(ryan, jeff).
false. % It's correct, nodes are in different graphs %
?- definitivefriend(amanda, leslie).
false. % It's correct, same explanation as before %
?- definitivefriend(sandra, oskar).
false. % It's wrong, expected result is true %
?- definitivefriend(oskar, sandra).
false. % It's wrong, expected result is true %
?- definitivefriend(betty, oskar).
true . % It's correct, both nodes are in the same graph %
?- definitivefriend(oskar, betty).
false. % It's wrong, expected result is true %
正如我在 cmets 中所说,即使使用同一图表的某些元素(除了邻居元素),definitivefriend 也会给我错误。在某些情况下,当我执行definitivefriend(X, Y) 时,我得到了正确的结果,但是当我执行definitivefriend(Y, X) 时,我得到了错误的结果。
【问题讨论】:
-
@CapelliC,这是你问我的数据。
标签: recursion prolog stack graph-theory