如何在不按空格键的情况下查看 SWI-Prolog 中的所有答案?
How to see all of the answers in SWI-Prolog without pressing spacebar?
简单示例:
?- between(1,10,X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
X = 7 ;
X = 8 ;
X = 9 ;
X = 10.
当使用 SWI-Prolog 使用 REPL 查看下一个答案时,必须按下空格键。
如何在不按空格键的情况下将所有结果列在屏幕上?
关于类似问题的注释。
如果您是通过搜索得出这个问题,而您真正的问题是
I'm using SWI-Prolog and I'm trying to print a list but if the list
has more than 9 items - it look like that -
[1, 15, 8, 22, 5, 19, 12, 25, 3|...]
is there a way to show the whole list?
然后看这些问答:
SWI-Prolog - show long list
一个“hackish”的解决方案是将 print(X), nl, fail
添加到调用中。这里print(X)
当然可以打印任何相关信息。例如 between(1,10,X), print(X), nl, fail
.
这是有效的,因为 print/1
[swi-doc] is just another predicate that prints the term that is passed to it. nl/0
[swi-doc] will print a new line character, and fail/0
[swi-doc] 总是失败。
因此,我们让 Prolog 提出解决方案,打印这些,打印一个新行,并且 fail
将 "activate" 旨在寻找另一个解决方案的回溯机制再次打印并失败。
最终所有的解都打印出来了,于是调用失败。这因此产生:
?- between(1,10,X), print(X), nl, fail.
1
2
3
4
5
6
7
8
9
10
false.
(Goal, false ; true)
代码模式被称为故障驱动循环。
也可以写成bagof( _, Goal, _)
。 Goal
可以进行一些打印,这些打印将逐渐出现,或者如果输出被缓冲则部分出现。请务必转义 Goal
中的所有自由变量(如 A^B^C^Goal
)。
您可以 运行 在 command/shell 提示符下将其作为 Prolog 源代码文件并将其输出重定向到“more
” shell 命令。
或者您可以简单地 运行 在 Prolog 的提示下查询并一直按住 ;
键。
鉴于(有点)最近添加了库(solution_sequences), and notably call_nth/2,今天你可以写
?- call_nth((between(1,4,X), writeln(X)), 100).
1
2
3
4
false.
当然,当只对前 100 个答案感兴趣时。有点控制力:
?- call_nth((between(1,4,X), writeln(X)), 2).
1
2
X = 2.
在 call_nth/2 之前,我使用的是 forall/2:
?- forall(between(1,4,X), writeln(X)).
1
2
3
4
true.
编辑
鉴于 call_nth 和 forall 是二进制谓词,一点语法糖可以缩短 REPL:在 ~/.swiplrc add
:- op(100, xfx, (?*)).
Gen ?* Test :- forall(Gen, Test).
:- op(1100, xfx, (?+)).
Run ?+ Count :- call_nth(Run, Count).
然后重启swipl,现在
?- between(1,4,X) ?* (S is X*X, writeln(square_of(X):S)).
square_of(1):1
square_of(2):4
square_of(3):9
square_of(4):16
true.
?- between(1,4,X), write(X), nl ?+ 2.
1
2
X = 2.
注意不同的优先级(100 与 1100)以及对迷你 DSL 的影响。
编辑
用 WillNess 的漂亮模式扩展 uDSL:
:- op(1100, fx, (*)).
(* Goal) :- (Goal, false ; true).
然后
?- * between(1,3,N), write(N), nl.
1
2
3
true.
简单示例:
?- between(1,10,X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
X = 7 ;
X = 8 ;
X = 9 ;
X = 10.
当使用 SWI-Prolog 使用 REPL 查看下一个答案时,必须按下空格键。
如何在不按空格键的情况下将所有结果列在屏幕上?
关于类似问题的注释。
如果您是通过搜索得出这个问题,而您真正的问题是
I'm using SWI-Prolog and I'm trying to print a list but if the list has more than 9 items - it look like that -
[1, 15, 8, 22, 5, 19, 12, 25, 3|...]
is there a way to show the whole list?
然后看这些问答:
SWI-Prolog - show long list
一个“hackish”的解决方案是将 print(X), nl, fail
添加到调用中。这里print(X)
当然可以打印任何相关信息。例如 between(1,10,X), print(X), nl, fail
.
这是有效的,因为 print/1
[swi-doc] is just another predicate that prints the term that is passed to it. nl/0
[swi-doc] will print a new line character, and fail/0
[swi-doc] 总是失败。
因此,我们让 Prolog 提出解决方案,打印这些,打印一个新行,并且 fail
将 "activate" 旨在寻找另一个解决方案的回溯机制再次打印并失败。
最终所有的解都打印出来了,于是调用失败。这因此产生:
?- between(1,10,X), print(X), nl, fail.
1
2
3
4
5
6
7
8
9
10
false.
(Goal, false ; true)
代码模式被称为故障驱动循环。
也可以写成bagof( _, Goal, _)
。 Goal
可以进行一些打印,这些打印将逐渐出现,或者如果输出被缓冲则部分出现。请务必转义 Goal
中的所有自由变量(如 A^B^C^Goal
)。
您可以 运行 在 command/shell 提示符下将其作为 Prolog 源代码文件并将其输出重定向到“more
” shell 命令。
或者您可以简单地 运行 在 Prolog 的提示下查询并一直按住 ;
键。
鉴于(有点)最近添加了库(solution_sequences), and notably call_nth/2,今天你可以写
?- call_nth((between(1,4,X), writeln(X)), 100).
1
2
3
4
false.
当然,当只对前 100 个答案感兴趣时。有点控制力:
?- call_nth((between(1,4,X), writeln(X)), 2).
1
2
X = 2.
在 call_nth/2 之前,我使用的是 forall/2:
?- forall(between(1,4,X), writeln(X)).
1
2
3
4
true.
编辑
鉴于 call_nth 和 forall 是二进制谓词,一点语法糖可以缩短 REPL:在 ~/.swiplrc add
:- op(100, xfx, (?*)).
Gen ?* Test :- forall(Gen, Test).
:- op(1100, xfx, (?+)).
Run ?+ Count :- call_nth(Run, Count).
然后重启swipl,现在
?- between(1,4,X) ?* (S is X*X, writeln(square_of(X):S)).
square_of(1):1
square_of(2):4
square_of(3):9
square_of(4):16
true.
?- between(1,4,X), write(X), nl ?+ 2.
1
2
X = 2.
注意不同的优先级(100 与 1100)以及对迷你 DSL 的影响。
编辑
用 WillNess 的漂亮模式扩展 uDSL:
:- op(1100, fx, (*)).
(* Goal) :- (Goal, false ; true).
然后
?- * between(1,3,N), write(N), nl.
1
2
3
true.