prolog在图表中列出

时间:2016-11-30 01:08:35

标签: prolog

嗨,我有这个prolog程序和图表

graph

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_3node_4) 程序输出

true;
Line=numbers_line.

但是,如果两个节点在同一条线上,但一条节点在多条线上 (例如node_anode_2)程序输出

true;
false

但是因为两个节点都在letters_line上,所以它应该输出

true;
Line = letters_line

我错过了什么帮助将不胜感激。

1 个答案:

答案 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}}(统一它!)与常用的行列表。

因此Linenode_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与行列表中的公共元素统一。