私は Java と C# に堪能なので、Prolog でのコーディングは、まったく別の考え方のようで、これまでかなり苦労しました。
私が解決しなければならない問題は単純で、Java で 10 分で解決できました。正直なところ、ここで始めても問題があります。有権者の「投票」を表す 10 個の数字のリストが与えられます。投票は 0、-1、または 1 のいずれかです。次に、リストのリストも与えられます。各リストは候補者のリストです。各候補者のリストには名前が含まれ、その後に有権者リストと同様の 10 のスコアが続きます。
私の目標は、Voter リストを各 Candidate リストと比較し、同じ投票に基づいて最良の一致のリストを返すことです。
これは私が与えられたものです:
?- 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 = [アダムス、フォード、マディソン] が返されます。
これまでのところ、私はあまり持っていません。私はこれをどのように行うべきかを理解しようとしています。複数のメソッドが必要になるのでしょうか、それとも best_candidates メソッド内ですべて実行できるようにする必要がありますか?
エドマンドの提案に応えて、これまでのところ私が持っているものは次のとおりです。
% 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.