2

我正在关注 Prolog 教程 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 .

如何获取/打印变量的可能值列表?

4

3 回答 3

1

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

主要:-
     forall(相邻(1,R),(写(R),nl))。

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

于 2016-05-09T08:38:27.877 回答
0

你需要一个失败循环:

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

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

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

于 2016-05-26T07:32:15.993 回答
0

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

于 2021-03-16T14:12:58.120 回答