首页 文章

使用Prolog以批处理模式打印出一个结果

提问于
浏览
0

在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) 的结果(真或假值)?

1 回答

  • 1

    如果你想写出 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谓词不是返回值的函数 . 此表达式仅将 L2 与术语 once(likes(sam, X)) 统一起来 .

    如果要写出地面查询,例如 likes(sam, dahl) 是成功还是失败:

    (   likes(sam, dahl)
    ->  write('true')
    ;   write('false')
    ), ...
    

相关问题