【问题标题】:Printing out only one result in batch mode with Prolog使用 Prolog 以批处理模式仅打印一个结果
【发布时间】:2015-02-02 23:33:41
【问题描述】:

在 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)), write(X), nl。你的第二个问题,使用:( likes(sam, dahl) -> write('true') ; write('false') ), nl。这就是你所追求的吗?

标签: prolog


【解决方案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')
), ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多