2012-07-14 31 views
2

假设我们有序言的知识基础是这样的:我怎样才能提供Prolog的问问题,我

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

当我问这个问题:

?- guilty(john) 

我想要的Prolog问我一个问题这样的:

is commits(john, murder) ? 

,我回答没有然后

is commits(john, theft) ? 

,如果我回答序言说

**yes** 

我怎样才能让这样的事情?

谢谢..

回答

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. 

纸条,上面写着/ 1,需要一个点,终止输入。

+0

谢谢你,这就是我正好问 – bahadrix 2012-07-25 13:43:14

0

序言“执行”的东西从左到右。尝试:

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

所以后来犯(X)取决于提交(X,谋杀)和/或提交(X,盗窃)

1

你想要一个'交互式外壳'为你的小推理。构建一个并不难,但超出了一个stackoverflow问题的范围。本教程在第2或第3课中构建一个,通常回答这个问题。它会调用诸如用户答案的​​“工作存储”之类的事实。

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