我怎样才能提供Prolog向我提问

时间:2012-07-14 17:10:59

标签: prolog logic logic-programming

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

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

当我问这个问题时:

?- guilty(john)

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

is commits(john, murder) ?

我回答然后

is commits(john, theft) ?

如果我回答 Prolog说

**yes**

我怎样才能做出这样的事情?

谢谢..

3 个答案:

答案 0 :(得分:2)

您需要一个经过修改的校对引擎,当遇到未知事实时会询问用户。

以一般性做这件事可能是一个有趣的任务,谷歌的元解释器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需要一个点来终止输入。

答案 1 :(得分:1)

你需要一个'互动外壳'供你的小推理员使用。构建一个并不困难,但超出了stackoverflow问题的范围。本教程在第2或第3课中构建一个,并且通常回答这个问题。它会调用诸如用户回答'工作存储'之类的事实。

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

答案 2 :(得分:0)

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

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

那么犯罪(X)依赖于提交(X,谋杀)和/或提交(X,盗窃)