2011-05-10 4 views
0

나는 swi prolog를 사용합니다. 나는이 인수에 대응 4.프롤로그에서 프로그램을 일반화하는 방법은 무엇입니까?

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). 

나는 다른 코드로 문제를 해결하기 위해 코드를 일반화하려고합니다.

이러한 인수에 대응 카운트로이 같은 사실베이스에 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

+0

"univ"술어를 사용하면 복합 용어를 목록으로 변환 할 수 있으며 반대로 첫 번째 항목은 펑터이고 나머지 항목은 인수입니다. 프롤로그 "사실"은 펑터가 술어 인 용어의 특별한 경우입니다. – hardmath

+0

hardmath가 말한 것. btw 프롤로그가 정말 기능적 프로그래밍이 아니므로 질문에 다시 답할 수 있습니다. –

관련 문제