我有几个序言事实:
relation('Kitchen', [item(spoon), item(fork), item(knife) ]).
relation('Lounge', [item(sofa), item(chair), item(table) ]).
relation('Bedroom', [item(bed), item(desk), item(drawers)]).
在运行时生成的列表,例如:
[item(spoon), item(knife)]
从这个列表中,在这种情况下,我希望返回'Kitchen',因为它是最佳匹配。
我想我需要使用intersection/3
谓词来计算运行时列表中有多少匹配,所以Kitchen会返回2而其他人会返回0,但我不知道在返回最佳匹配之前,递归所有relation/2
谓词并测试每个谓词的方法。
答案 0 :(得分:1)
最佳解决方案是无法改进的解决方案:
\+ better_candidate(Goal,CurSolution)
。当然,您可以实现更精细的比较技术,而不是简单的长度比较。
:- use_module(library(lists)).
relation('Kitchen', [item(spoon), item(fork), item(knife) ]).
relation('Lounge', [item(sofa), item(chair), item(table) ]).
relation('Bedroom', [item(bed), item(desk), item(drawers)]).
best(X,Best) :-
relation(Best,BestList), intersection(X,BestList,I),
length(I,L),
\+ better_candidate(X,L).
better_candidate(X,L) :-
relation(C,CList), intersection(X,CList,CI),
length(CI,CIL), CIL > L.