我正在尝试检查行是否实际位于规则集中存在的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的新手,并且想要了解如何做到这一点。
答案 0 :(得分:5)
你可以写:
real_line(X,Y):-line(X,Y),point(X),point(Y).
Prolog中的,
表示合乎逻辑的"和#34; ,因此上述谓词real_line/2
在X,Y成立时成功: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)].
带有故障驱动循环的OR :
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.