我有一个充满interacts
关系的事实库:
% Drug, Drug, Interaction Effect
interacts(terbinafine,tramadol,muscle_spasm).
interacts(terbinafine,triazolam,amnesia).
interacts(terbinafine,warfarin,arterial_pressure_nos_decreased).
interacts(terbinafine,warfarin,bradycardia).
interacts(terbinafine,rosiglitazone,hyperglycaemia).
interacts(terbinafine,allopurinol,arterial_pressure_nos_decreased).
以及确定两种药物是否相互作用的函数:
interacts_with(D1, D2) :-
interacts(D1, D2, _) ; interacts(D2, D1, _).
我试图列出两种给定药物的所有相互作用。鉴于两种药物相互作用(interacts_with()
返回true
),我将如何收集这两种药物相互作用的副作用?
例如:
interacts_with(terbinafine, warfarin).
应该返回:
[arterial_pressure_nos_decreased, bradycardia]
我一直在尝试findall/3
,但我只得到我传入的返回列表,其中包含更多存在的匹配项:
?- findall([terbinafine, warfarin], interacts_with(D1, D2), Foo).
Foo = [[terbinafine, warfarin], [terbinafine, warfarin], [terbinafine, warfarin], [terbinafine, warfarin], [terbinafine, warfarin], [terbinafine, warfarin], [terbinafine, warfarin], [terbinafine|...], [...|...]|...].
编辑
我试图实现@false 建议的内容:
interacts_with(D1, D2) :-
interacts(D1, D2, _) ; interacts(D2, D1, _).
print_effects(D1, D2) :-
( interacts_with(D1,D2)
-> findall([D1, D2], interacts_with(D1, D2), [])
; write(D1), write(" does not interact with "), write(D2)
).
现在我得到:
?- print_effects(terbinafine, warfarin).
false.
两者setof
都findall
返回false
,而不是传入的药物清单