使用 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')
), ...