0

プロローグには次の事実があります。

p(cold,[flu,high_body_temp,headache,dizzy],0.3],
p(cold,[flu,not high_body_temp,headache,dizzy],0.2],
p(cold,[flu,high_body_temp,not headache,dizzy],0.4],
p(cold,[flu,high_body_temp,headache,not dizzy],0.1],
p(cold,[not flu,high_body_temp,headache,dizzy],0.3],
p(cold,[flu,not high_body_temp,headache,not dizzy],0.3],


p(diarrhea,[headache,not stomachache,dizzy,vomit],0.5),
p(diarrhea,[headache,stomachache,not dizzy,vomit],0.4),
p(diarrhea,[headache,stomachache,dizzy,not vomit],0.2),
p(diarrhea,[not headache,stomachache,dizzy,vomit],0.1),
p(diarrhea,[headache,not stomachache,not dizzy,not vomit],0.1),

実行時に生成されるリスト。例:

[flu,headache]

[flu,headache] の「true」要素を含む 2 つの事実から答えを得る必要がありますが、「not」は要素が存在しないことを意味します。

p(cold,[flu,not high_body_temp,headache,not dizzy],0.3],
p(diarrhea,[headache,not stomachache,not dizzy,not vomit],0.1),

答えは次のようになります。

cold = 0.3
diarrhea = 0.1

これを行うためにプロローグにコードを書くにはどうすればよいですか?助けてください。私は完全に立ち往生しています。TQ。

4

1 に答える 1

0

構文エラーを修正すると、非常に単純な一致のようです。

:- op(100, fx, not).

p(cold,[flu,high_body_temp,headache,dizzy],0.3).
p(cold,[flu,not high_body_temp,headache,dizzy],0.2).
p(cold,[flu,high_body_temp,not headache,dizzy],0.4).
p(cold,[flu,high_body_temp,headache,not dizzy],0.1).
p(cold,[not flu,high_body_temp,headache,dizzy],0.3).
p(cold,[flu,not high_body_temp,headache,not dizzy],0.3).


p(diarrhea,[headache,not stomachache,dizzy,vomit],0.5).
p(diarrhea,[headache,stomachache,not dizzy,vomit],0.4).
p(diarrhea,[headache,stomachache,dizzy,not vomit],0.2).
p(diarrhea,[not headache,stomachache,dizzy,vomit],0.1).
p(diarrhea,[headache,not stomachache,not dizzy,not vomit],0.1).

answer(L, A, N) :-
    p(A, S, N), maplist(match(L), S).
match(L, not S) :-
    \+ memberchk(S, L).
match(L, S) :-
    memberchk(S, L).

収量

10 ?- answer([flu,headache],A,N).
A = cold,
N = 0.3 ;
A = diarrhea,
N = 0.1 ;
false.
于 2013-03-11T08:28:22.777 に答える