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

Oll*_*lu_ 3 point prolog line

我试图检查行是否实际在规则集中存在的2个点之间.例如,在下面的代码中,

point(a).
point(z).

line(l,k).
line(k,l).
line(k,a).
line(a,z).
Run Code Online (Sandbox Code Playgroud)

line(a,z).是一个真正的线,因为az在设置规则两个点,但line(l,k).并不是真正的线,因为lk没有在规则组真实点.

我是Prolog的新手,并且想要了解如何做到这一点.

cod*_*der 5

你可以写:

real_line(X,Y):-line(X,Y),point(X),point(Y).
Run Code Online (Sandbox Code Playgroud)

,Prolog中表示逻辑"与",因此上面的谓词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.
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据您的评论查找可以使用的所有不正确的行:

findall(line(X,Y),(line(X,Y), \+ real_line(X,Y)),L).
Run Code Online (Sandbox Code Playgroud)

例:

?- findall(line(X,Y),(line(X,Y), \+ real_line(X,Y)),L).
L = [line(l, k), line(k, l), line(k, a)].
Run Code Online (Sandbox Code Playgroud)

或者使用失败驱动的循环:

write_incorrect_lines:-
            line(X,Y),
            \+real_line(X,Y),
            write(line(X,Y)),
            nl,
            fail;
            true.
Run Code Online (Sandbox Code Playgroud)

例:

?- write_incorrect_lines.
line(l,k)
line(k,l)
line(k,a)
true.
Run Code Online (Sandbox Code Playgroud)