我正在尝试检查线是否实际上位于规则集中存在的 2 个点之间。例如在下面的代码中,
point(a).
point(z).
line(l,k).
line(k,l).
line(k,a).
line(a,z).
line(a,z).
是一条实线,因为 a
和 z
都是规则集中的点,但 line(l,k).
不是实线,因为 l
和 k
不是规则集中的实点。我是 Prolog 的新手,只是想要一些有关如何执行此操作的指示。
最佳答案
你可以写:
real_line(X,Y):-line(X,Y),point(X),point(Y).
Prolog 中的 ,
表示逻辑 “和” 所以当 for X,Y 成立时,上面的谓词 real_line/2
成功:line(X,Y)
和 X
是一个点,Y
是一个点。一些例子:
?- real_line(a,z).
true.
?- real_line(a,k).
false.
?- real_line(l,k).
false.
?- real_line(X,Y).
X = a,
Y = z.
?- real_line(X,z).
X = a.
?- real_line(a,Y).
Y = z.
更新
根据您的评论找到您可以使用的所有不正确的行:
findall(line(X,Y),(line(X,Y), \+ real_line(X,Y)),L).
例子:?- findall(line(X,Y),(line(X,Y), \+ real_line(X,Y)),L).
L = [line(l, k), line(k, l), line(k, a)].
或 带有故障驱动循环:write_incorrect_lines:-
line(X,Y),
\+real_line(X,Y),
write(line(X,Y)),
nl,
fail;
true.
例子:?- write_incorrect_lines.
line(l,k)
line(k,l)
line(k,a)
true.
关于prolog - 试图检查线是否存在于 2 个点之间,Prolog,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47190647/