2014-10-22 60 views
0

我在一本字典類節目正在與序言,我的代碼是這樣的:在Prolog我怎麼可以削減多餘的答案

define(car,vehicle). 
define(car,that). 
define(car,has). 
define(car,four). 
define(car,wheels). 
define(wheels,round). 
define(wheels,object). 
define(wheels,used). 
define(wheels,in). 
define(wheels,transportation). 


defined(X):-define(X,_). 

anotherdefined(X):- \+ undefined(X). 
undefined(X):- \+define(X,_).   

我想寫一個定義/ 1謂詞,這將給我:

?-defined(X). 
X = car ; 
X = wheels ; 
false. 

然而,我的定義/ 1給了我X=car. 5次(自然)爲每次它抵抗define(car,_). 和我anotherdefined/1給了我唯一的true.什麼方法停止序言回溯到其他實例define(car,_).,並跳至define(wheels,_).

編輯:我寫了下面的行得到的結果我想givedefinedword/1,

listdefined(X):-findall(Y,defined(Y),Z),sort(Z,X). 
givedefinedword(X):-listdefined(List),member(X,List). 

然而,因爲我想一個有效的謂詞(我將在許多人使用),它打敗目的。這個謂詞做了太多的過程。

或者,使用修飾代碼的謂詞會更好嗎?例如準備一個定義的單詞列表,並在添加新定義時對其進行修改。

謝謝。

+1

請參閱'bagof/3'和'setof/3'。 – 2014-10-22 06:23:27

回答

0

如果更改define到相關項目,並列出,像

definelist(car, [vehicle, that, has, four, wheels]). 
% etc. 
defined(X) :- definelist(X, _). 

然後defined將不再會產生重複,也不需要線性空間。

當然,查詢define(X, Y)現在必須執行爲definelist(X, L), member(Y, L)。如果你希望這也是有效的,你可能需要複製所有的定義。

+0

謝謝,我認爲現在是我開始按照列表思考的時候了。 「你可能需要複製所有定義」是什麼意思? – 2014-10-23 01:32:33

+0

@MericUsta你會定義(汽車,車輛)以及我建議的'definelist',並將所有的定義放在兩個謂詞中。我實際上並不推薦這樣做,但如果速度很重要,有辦法將其自動化,因此您不必手動複製所有內容。 – 2014-10-23 07:03:43

0

你想用你的程序實現什麼?看來你想擁有的形式事實:

「汽車是具有四個車輪的車輛」

「輪是在運輸中使用的圓形物體」(有點含糊)

如何你打算使用這些事實嗎? @larsmans建議如果完全沒問題,如果你只想把你的陳述作爲一個「句子」。這實際上取決於你將如何處理這些信息。

考慮結構化數據庫中的信息:鑑於這種數據庫

is(car, vehicle). 
is(bicycle, vehicle). 
is(boat, vehicle). 
has(car, wheel(four)). 
has(car, motor). 
has(bicycle, wheel(two)). 

,你至少可以問一個問題一樣,「什麼車有哪些?」,「沒有自行車有一個電機?」,或者可能是「一輛車有多少個車輪?」,或者「哪些車輛沒有車輪?」。

?- is(X, vehicle). 
?- has(bicycle, motor). 
?- has(car, wheel(N)). 
?- is(X, vehicle), \+ has(X, wheel(_)). 

等等。

一旦你更好地定義了你的問題,你可以更好地定義你的數據結構,這將使編寫一個程序來解決你的問題更容易。

+0

謝謝你的評論,它給了我一些很好的見解。現在我更關心單詞的定義..(當然,目前只是假定義),但也可能會在後面進行分類。 – 2014-10-23 01:37:48