私は関係でいっぱいのファクトベースを持っています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).
そして、2 つの薬物が相互作用するかどうかを判断する関数:
interacts_with(D1, D2) :-
interacts(D1, D2, _) ; interacts(D2, D1, _).
与えられた 2 つの薬物の相互作用効果をすべてリストアップしようとしています。2 つの薬が相互に作用する ( interacts_with()
return true
) 場合、相互作用する 2 つの薬の副作用を収集するにはどうすればよいでしょうか?
例えば:
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