Prolog 序言:获取变量的所有可能值

Prolog 序言:获取变量的所有可能值,prolog,prolog-toplevel,Prolog,Prolog Toplevel,我跟在后面 节目 adjacent(1, 2). adjacent(1, 3). adjacent(1, 4). main:- adjacent(1, R), write(R). 打印2 但它假设根据教程打印可能值的列表: ?- adjacent(1,2). yes ?- adjacent(1,3). no ?- adjacent(1,R). R = 2 ; R = 3 ; R = 4 ; no 我在repl中再次尝试,但结果相同: ?- adjacent(

我跟在后面

节目

adjacent(1, 2).
adjacent(1, 3).
adjacent(1, 4).

main:-
    adjacent(1, R),
    write(R).
打印
2

但它假设根据教程打印可能值的列表:

?- adjacent(1,2). 
yes 
?- adjacent(1,3). 
no 
?- adjacent(1,R). 
R = 2 ; 
R = 3 ; 
R = 4 ; 
no
我在repl中再次尝试,但结果相同:

?- adjacent(1, R).
R = 2 .
如何获取/打印变量的可能值列表?

在swipl中,library()默认为自动加载,因此您可以编写

main:- forall(adjacent(1, R), (write(R),nl)). 主要内容:- (相邻(1,R),(写入(R),nl))。
注意:Action是一个conjuction,只是为了说明所需的正确语法。对于任何实际用途,
main:-forall(相邻(1,R),writeln(R))。
可能更好。

您需要一个故障循环:

adjacent(1, 2).
adjacent(1, 3).
adjacent(1, 4).

main :-
    adjacent(1, R),
    write(R), nl,
    fail.
main.

这是Prolog中的一种基本编程技术。失败/0将强制回溯,因此将探索下一个相邻的/2解决方案(依此类推)。main/0的第二个子句防止循环本身发生故障。

在Prolog打印
R=2之后,您可以按“r”、“n”、“TAB”或[SPACE]显示下一个结果。

我不知道写(R)是如何工作的。
但教程的代码中没有这一点,所以我认为这应该是你按下Return键的诀窍!按空格键获得下一个答案。
相邻(1,3)。
应产生
。有一件事你做得不太对,但它是不可见的。@false我在repl中做的,但是当以脚本(如
swipl-q-f nexting.pl-t main
)运行程序时,如何获得这些值呢?