prolog - 我如何向我提供 Prolog 提问

标签 prolog

假设我们有这样的序言知识库:

guilty(X) :-
    commits(X,Y),
    crime(Y).
crime(murder).
crime(theft)

当我问这个问题时:

?- guilty(john)

我希望 Prolog 能问我这样的问题:

is commits(john, murder) ?

然后我回答

is commits(john, theft) ?

如果我回答 Prolog 说

**yes**

我怎样才能做出这样的东西?

谢谢..

最佳答案

您需要一个改进的证明引擎,当遇到未知事实时向用户查询。

用一些通用性来做它可能是一项有趣的任务,Google for metainterpreter Prolog,如果你对这个论点感兴趣,第一个链接为你提供了有值(value)的页面 A Couple of Meta-interpreters in Prolog由 Markus Triska 撰写,您可以在此处了解更多信息。

对于你的问题,一条规则就足够了

commits(Person, Crime) :-
    crime(Crime),
    format('is ~w ?', [commits(Person, Crime)]),
    read(yes).

测试:

?- guilty(john).
is commits(john,murder) ?no.
is commits(john,theft) ?yes.
true.

注意 read/1 需要一个点来终止输入。

关于prolog - 我如何向我提供 Prolog 提问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485750/

相关文章:

prolog - 背包寻找最大

prolog - 为什么Prolog ','运算符是右结合的,而它是从左到右处理的

prolog - SWI-Prolog 如何证明3个列表的和是否相同?

Prolog程序,用于查找列表中的最小值和下一个最小值

PROLOG:检查第一个列表包含的每个元素是否比第二个列表少 3 倍

prolog - 将术语转换为原子并在 YAP prolog 中保留变量名称

prolog - 初学者 Prolog 堆栈溢出

prolog - 从 Prolog 中的列表构建复合谓词

prolog - 需要帮助理解 Prolog 中的某些东西

graphics - 在 SWI(或任何)Prolog 中绘图