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

Prolog: get all possible values of a variable

我正在关注 Prolog Tutorial 2.1

计划

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 .

我怎样才能 get/print 一个变量可能值的列表?

在 swipl 中,library(apply) 默认是自动加载的,所以你可以写

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

注意:Action 是一个连词,只是为了说明所需的正确语法。出于任何实际目的,main :- forall(adjacent(1, R), writeln(R)). 可能会更好。

你需要一个故障循环:

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

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

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

在 Prolog 打印出 R = 2; 后,您可以按“r”、“n”、[TAB] 或 [SPACE] 来显示下一个结果。 我不知道它如何与 write(R). 一起工作,但这不在教程的代码中,所以我认为这应该是诀窍