我正在尝试检查线是否实际上位于规则集中存在的 2 个点之间。例如在下面的代码中,

point(a).
point(z).

line(l,k).
line(k,l).
line(k,a).
line(a,z).
line(a,z). 是一条实线,因为 az 都是规则集中的点,但 line(l,k). 不是实线,因为 lk 不是规则集中的实点。

我是 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/

10-11 22:51
查看更多