嗨,我有这个prolog程序和图表
node(node_1,[numbers_line]).
node(node_2,[numbers_line, letters_line]).
node(node_3,[numbers_line]).
node(node_4,[numbers_line]).
node(node_5,[numbers_line, animal_line, colour_line]).
node(node_6,[numbers_line]).
node(node_a,[letters_line]).
node(node_b,[letters_line]).
node(node_c,[letters_line]).
node(node_cat, [animal_line]).
node(node_dog, [animal_line]).
node(node_red, [colour_line]).
node(node_blue, [colour_line]).
node(node_green, [colour_line]).
然后我有一条规则说明
sameline(X,Y,Line).
sameline(X,Y,Line):-node(X,Line), node(Y,Line).
如果两个节点位于同一行(例如node_3
和node_4
)
程序输出
true;
Line=numbers_line.
但是,如果两个节点在同一条线上,但一条节点在多条线上
(例如node_a
和node_2
)程序输出
true;
false
但是因为两个节点都在letters_line
上,所以它应该输出
true;
Line = letters_line
我错过了什么帮助将不胜感激。
答案 0 :(得分:0)
尝试
sameline(X, Y, Line) :-
node(X, LineListX),
node(Y, LineListY),
member(Line, LineListX),
member(Line, LineListY).
您的第一个sameline/3
条款
sameline(X,Y,Line).
是错误的,因为它说每个几个节点都在同一行,没有设置(统一!)一行的值。
您的第二个sameline/3
条款
sameline(X,Y,Line):-node(X,Line), node(Y,Line).
是错误的,因为它表示如果第一个节点的行列表相同(具有相同的顺序!),则第二个节点的行列表中的几个节点位于同一行中并设置{ {1}}(统一它!)与常用的行列表。
因此Line
和node_3
导致同一行,因为node_4
(列表包含单个元素[numbers_line]
)等于numbers_line
。 [numbers_line]
应与Line
(列表)统一,而不是与[numbers_line]
统一。
所以numbers_line
应该返回false(第二个子句),因为sameline(node_a, node_2, Line)
与[letters_line]
不同
正确的模式是检测[numbers_line, letters_line]
LineListX
列表
X
检测node(X, LineListX),
LineListY
列表
Y
将node(Y, LineListY),
与Line
的单个元素统一起来(尝试使用LineListX
的每个元素)
LineListX
并检查member(Line, LineListX),
是否也是LineListY的成员
Line
如果最后一个条件为真,则member(Line, LineListX).
返回true,sameline
与行列表中的公共元素统一。