Ես վարժ տիրապետում եմ 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 մեթոդի շրջանակներում:
Ի պատասխան Էդմունդի առաջարկի, ահա թե ինչ ունեմ մինչ այժմ.
% 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.
match_single_entry(X,Y, M)
-ը կարող է կապելM = 1
-ը, եթեX
-ը ևY
-ը ոչ զրոյական են և նույնը, կամM = -1
-ը, եթե դրանք ոչ զրոյական են և տարբեր են: Հակառակ դեպքում, եթե մեկը զրո է, ապաM = 0
: Գիտե՞ք ինչպես գրելmatch_single_entry
այդպես: 19.11.2012