试图检查线条存在于2点之间,Prolog

时间:2017-11-08 22:16:27

标签: prolog line point

我正在尝试检查行是否实际位于规则集中存在的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的新手,并且想要了解如何做到这一点。

1 个答案:

答案 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.