2011-05-10 41 views
0

我使用swi prolog。我有一個事實依據這樣的事實,包括與元數4.如何在prolog中按照arity概括程序?

attribute(a1,a2,a3,a4). 
data(yes,no,no,no). 
data(yes,no,yes,no). 
data(yes,yes,yes,no). 
data(yes,yes,yes,yes). 
data(no,yes,yes,yes). 

當我打電話pbayes(是的,不,不,不,結果)結果我的代碼計算概率;

p(ColumnName,ColumnValue,Result):- 
(
(ColumnName==a1->findall(ColumnValue,data(ColumnValue,_,_,_),Liste)); 
(ColumnName==a2->findall(ColumnValue,data(_,ColumnValue,_,_),Liste)); 
(ColumnName==a3->findall(ColumnValue,data(_,_,ColumnValue,_),Liste)); 
(ColumnName==b->findall(ColumnValue,data(_,_,_,ColumnValue),Liste)) 
), 
length(Liste,Sayac), 
findall(_,data(_,_,_,_),TumListe), 
length(TumListe,TumSayac), 
Result is Sayac/TumSayac. 

pcond(ColumnName,ColumnValue,BValue,Result):- 
(
s(ColumnName==a1->findall(ColumnValue,data(ColumnValue,_,_,BValue),Liste)); 
(ColumnName==a2->findall(ColumnValue,data(_,ColumnValue,_,BValue),Liste)); 
(ColumnName==a3->findall(ColumnValue,data(_,_,ColumnValue,BValue),Liste)) 
), 
length(Liste,Sayac), 

findall(BValue,data(_,_,_,BValue),BListe), 
length(BListe,BSayac), 
Result is Sayac/BSayac. 

pbayes(B,A1,A2,A3,Result):- 

pcond(a1,A1,B,ResultCondA1), 
pcond(a2,A2,B,ResultCondA2), 
pcond(a3,A3,B,ResultCondA3), 
p(b,B,ResultB), 
(Mult1=0->Result is 0,!;true), 

p(a1,A1,ResultA1),p(a2,A2,ResultA2),p(a3,A3,ResultA3), 
Mult2 is ResultA1 * Result2 * ResultA3, 
(Mult=0->Result is 0; Result is Mult1/Mult2). 

我試圖概括我的代碼來解決不同arities的問題。

如元數的計數可以是6事實上鹼這樣的:

attribute(a1,a2,a3,a4,a5,a6). 
data(yes,yes,yes,no,no,no). 
data(yes,yes,yes,no,no,yes). 

我的程序具有適應於元數。你有什麼想法我可以做到這一點?

回答

0

把所有的參數列表中的像

attribute([a1,a2,a3,a4,a5,a6]). 
data([yes,yes,yes,no,no,no]). 
data([yes,yes,yes,no,no,yes]). 

,然後遞歸處理的數據是什麼,我會怎麼做。

如果由於某種原因,你希望有不同的arities謂詞,您可以使用=../2運營商獲取列表中的參數,然後處理它們

,或者你可以爲每個參數數量XD

編寫代碼
+0

你能否進一步解釋一下。 – onurozcelik 2011-05-10 11:43:59

+0

「univ」謂詞讓我們可以將複合詞轉換爲列表,相反,列表中的第一項是函子,其餘項是參數。 Prolog「事實」是函子是謂詞的一個特例。 – hardmath 2011-05-10 12:01:38

+0

硬性說什麼。順便說一句prolog不是真正的函數式編程,所以你可能想重新提出這個問題 – 2011-05-10 12:25:50