2012-07-14 64 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/