假设我们有这样的序言知识库:
guilty(X) :-
commits(X,Y),
crime(Y).
crime(murder).
crime(theft)
当我问这个问题时:
?- guilty(john)
我希望Prolog问我这样的问题:
is commits(john, murder) ?
我回答否然后
is commits(john, theft) ?
如果我回答是 Prolog说
**yes**
我怎样才能做出这样的事情?
谢谢..
答案 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课中构建一个,并且通常回答这个问题。它会调用诸如用户回答'工作存储'之类的事实。
答案 2 :(得分:0)
Prolog“执行”从左到右的事情。尝试:
guilty(X) :-
crime(Y),
commits(X,Y).
crime(murder).
crime(theft)
那么犯罪(X)依赖于提交(X,谋杀)和/或提交(X,盗窃)