3

假设我们有这样的 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**

我怎么能做这样的事情?

谢谢..

4

3 回答 3

4

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

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

对于您的问题,就足够了

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 需要一个点来终止输入。

于 2012-07-15T19:20:23.607 回答
1

您需要一个“交互式外壳”来供您的小推理者使用。构建一个并不困难,但超出了 stackoverflow 问题的范围。本教程在第 2 或第 3 课中构建一个,并且通常会回答这个问题。它称您的用户回答“工作存储”之类的事实。

http://www.amzi.com/ExpertSystemsInProlog/

于 2012-11-08T00:04:25.870 回答
0

Prolog 从左到右“执行”事情。尝试:

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

那么有罪(X)取决于提交(X,谋杀)和/或提交(X,盗窃)

于 2012-07-14T20:07:30.927 回答