我试图检查行是否实际在规则集中存在的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).是一个真正的线,因为a和z在设置规则两个点,但line(l,k).并不是真正的线,因为l并k没有在规则组真实点.
我是Prolog的新手,并且想要了解如何做到这一点.
你可以写:
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)
根据您的评论查找可以使用的所有不正确的行:
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)