我精通 Java 和 C#,因此在 Prolog 中进行编码对我来说是一项相当艰巨的任务,因为它似乎是一种完全不同的思维方式。
我需要解决的问题很简单,用 Java 十分钟就能搞定。老实说,即使从这里开始,我也遇到了麻烦。我得到了代表选民“投票”的十个数字的列表。投票是 0、-1 或 1。然后我还会得到一个列表列表,每个列表都是候选人的列表。每个候选人的名单包括一个名字,后面跟着十个与选民名单类似的分数。
我的目标是然后将选民名单与每个候选人名单进行比较,并根据相同的选票返回最佳匹配名单。
这是给我的:
?- best_candidates(
[ 0, 0, 0, 1, 1, 1, -1, -1, -1, 1],
[[adams 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[grant -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
[polk 1, -1, 1, -1, 1, -1, 1, -1, 1, -1],
[jackson 1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[taft 0, -1, 0, -1, 0, -1, 0, -1, 0, -1],
[ford 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[madison 0, 0, 0, 1, -1, 0, 0, -1, 1, 1]],
BestMatches).
这应该返回 BestMatches = [adams, Ford, madison]。
到目前为止,我没有太多。我只是想弄清楚我应该怎么做。我是否需要多种方法,或者我应该能够在 best_candidates 方法中完成这一切?
针对 Edmund 的建议,这是我目前所拥有的:
% match V1 and V2 and unify M with the match score
% match(V1, V2, M)
match([], [], 0).
match([H1|T1], [H2|T2], M) :-
match_single_entry(H1, H2, M1),
match(T1, T2, M2),
M is M1+M2.
% match_single_entry(I, J, M)
match_single_entry(X, Y, M) :-
X =\= 0,
Y =\= 0,
I =:= J,
M is 1.