使用 Prolog 以批处理模式仅打印出一个结果
Printing out only one result in batch mode with Prolog
在 Prolog 中,我可以调出 REPL 以交互方式(交互模式)测试 Prolog 代码,也可以将代码写在文件中以从命令行执行(批处理模式)。
在交互模式下,我使用setof
函数获取所有结果。
?- [likes].
?- setof(X, likes(sam, X), L).
L = [chips, chop_suey, chow_mein, dahl, kurma, pizza, spaghetti, sweet_and_sour, tandoori].
我可以继续问?- likes(sam, X)
的结果,
我也可以使用 once
函数只得到一个结果。
?- once(likes(sam,X)).
X = dahl.
因为我可以使用相同的 setof 函数以批处理方式打印出结果。
:- initialization main.
main :-
[likes],
setof(X, likes(sam, X), L),
write(L),
halt.
那么,如何获取并打印出once(likes(sam,X))
的结果呢?
我尝试使用 L2 = once(likes(sam, X)
打印出 L2
中的结果,但出现错误。
一般情况下,交互模式的结果如何获取?
比如如何批量打印出?- likes(sam, dahl)
的结果(真值或假值)?
如果要写出once(likes(sam,X))
的结果:
once(likes(sam, X)),
write(X), ...
如果没有找到X
就想输出false,那么:
( once(likes(sam, X))
-> write(X)
; write('Nobody likes sam')
), ...
L2 = once(likes(sam, X))
会失败,因为 Prolog 谓词不是 return 值的函数。此表达式只是将 L2
与术语 once(likes(sam, X))
.
统一起来
如果要写出地面查询,例如likes(sam, dahl)
成功还是失败:
( likes(sam, dahl)
-> write('true')
; write('false')
), ...
在 Prolog 中,我可以调出 REPL 以交互方式(交互模式)测试 Prolog 代码,也可以将代码写在文件中以从命令行执行(批处理模式)。
在交互模式下,我使用setof
函数获取所有结果。
?- [likes].
?- setof(X, likes(sam, X), L).
L = [chips, chop_suey, chow_mein, dahl, kurma, pizza, spaghetti, sweet_and_sour, tandoori].
我可以继续问?- likes(sam, X)
的结果,
我也可以使用 once
函数只得到一个结果。
?- once(likes(sam,X)).
X = dahl.
因为我可以使用相同的 setof 函数以批处理方式打印出结果。
:- initialization main.
main :-
[likes],
setof(X, likes(sam, X), L),
write(L),
halt.
那么,如何获取并打印出once(likes(sam,X))
的结果呢?
我尝试使用 L2 = once(likes(sam, X)
打印出 L2
中的结果,但出现错误。
一般情况下,交互模式的结果如何获取?
比如如何批量打印出?- likes(sam, dahl)
的结果(真值或假值)?
如果要写出once(likes(sam,X))
的结果:
once(likes(sam, X)),
write(X), ...
如果没有找到X
就想输出false,那么:
( once(likes(sam, X))
-> write(X)
; write('Nobody likes sam')
), ...
L2 = once(likes(sam, X))
会失败,因为 Prolog 谓词不是 return 值的函数。此表达式只是将 L2
与术语 once(likes(sam, X))
.
如果要写出地面查询,例如likes(sam, dahl)
成功还是失败:
( likes(sam, dahl)
-> write('true')
; write('false')
), ...