2013-03-11 79 views
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] 

我们应该从两个事实得到的答案包含“真” [感冒,头痛]的,而“不”的意思元素该元素是不存在的:

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 

如何在prolog中编写代码以完成此操作?请帮助。我完全陷入困境。 TQ。

回答

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. 
+0

哇..这是工作!非常感谢你.. :) – wana 2013-03-11 09:47:25

+0

@wana:那么你应该接受答案。 – CapelliC 2013-03-11 09:49:44