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).
내 프로그램은 인수에 대응 자체를 조정할 수 있습니다. 내가 어떻게이 일을 성취 할 수 있는지 알고 있니?
더 자세히 설명해 주실 수 있습니까? – onurozcelik
"univ"술어를 사용하면 복합 용어를 목록으로 변환 할 수 있으며 반대로 첫 번째 항목은 펑터이고 나머지 항목은 인수입니다. 프롤로그 "사실"은 펑터가 술어 인 용어의 특별한 경우입니다. – hardmath
hardmath가 말한 것. btw 프롤로그가 정말 기능적 프로그래밍이 아니므로 질문에 다시 답할 수 있습니다. –