在prolog程序中,如下所述:
town(a).
town(b).
town(c).
town(d).
dam(e).
dam(f).
link(a,b).
link(a,c).
link(c,d).
link(b,d).
link(b,c).
link(c,e).
link(a,e).
link(d,f).
neighbour(X,Y):- link(X,Y) ; link(Y,X).all_neighbours(L,X)将所有邻近城镇的列表L返回给X:all_neighbours(L,X):- town(Y),findall(Y,邻居(X,Y),L)。
这是正确的程序吗?has_dam(L)返回至少有一个相邻大坝的所有城镇的列表L:has_dam(L):- dam(Y),town(X),findall(X,town(X,Y),L)。
这是正确的程序吗?no_dam(L)返回没有邻近大坝的所有城镇的列表L:no_dam(L):- town(X),no dam(Y),findall(X,邻居(X,Y),L)。
发布于 2012-01-25 13:43:51
不,这些都不对。在第一个过程中,对town的调用应该在findall的范围内完成。
all_neighbours(Neighbourhood, X) :-
findall(Y, (town(Y), neighbour(X, Y)), Neighbourhood).其他人也一样。注意findall的第二个参数周围的括号。这些是必需的,因为
findall(Y, town(Y), neighbour(X, Y), Neighbourhood)将被解析为对(可能不存在的) findall/4的调用。
要理解findall查询,请详细说明:
查找所有的
Y(Y是一个城镇,X邻居是Y),并调用结果Neighbourhood.
。
https://stackoverflow.com/questions/9003552
复制相似问题