我正在写这段代码:
score_one_topic(_,[],0).
score_one_topic(Topic,[H|T],Score):-
pairs_keys_values([H],[X],_),
sub_string(case_insensitive,X,Topic),
get_weight(H,Weight),
Score is Weight + ScoreTemp.
所以,基本上我有一个关键字列表,每个关键字都有一个权重。
使用score_one_topic我计算主题的分数(例如Topic ='Nice Weather')。分数最初为0,每次列表中的关键字是主题的子字符串时,分数将按关键字的权重递增。
我的问题是,如果列表中的关键字不是主题的子字符串,则返回false并且分数丢失..即使sub_string返回false,有没有办法继续递归?
答案 0 :(得分:0)
您错过了已发布代码中的递归。我认为它看起来像这样:
score_one_topic(Topic, [H|T], Score):-
pairs_keys_values([H], [X], _),
sub_string(case_insensitive, X, Topic),
get_weight(H, Weight),
score_one_topic(Topic, T, ScoreTemp),
Score is Weight + ScoreTemp.
获得所需结果的一种方法是在不匹配的子字符串上取得成功,但得到0分:
score_one_topic(Topic, [H|T], Score):-
sub_string_score(Topic, H, SubScore),
score_one_topic(Topic, T, RestScore),
Score is RestScore + SubScore.
sub_string_score(Topic, X, SubScore) :-
pairs_keys_values([H], [X], _),
sub_string(case_insensitive, X, Topic), !,
get_weight(H, SubScore).
sub_string_score(_, _, 0).
现在你有一个谓词来计算一个列表项的得分,你可以使用maplist
:
score_one_topic(Topic, Keys, Score) :-
maplist(sub_string_score(Topic), Keys, Scores),
sum_list(Scores, Score).
答案 1 :(得分:0)
谢谢,所以对我有用的最终代码是:
score_one_topic(_,[],0).
score_one_topic(Topic, [H|T], Score):-
score_one_topic(Topic, T, RestScore),
sub_string_score(Topic, H, SubScore),
Score is RestScore + SubScore.
sub_string_score(Topic, H, SubScore) :-
pairs_keys_values([H], [X], _),
sub_string(case_insensitive, X, Topic), !,
get_weight(H, SubScore).
sub_string_score(_, _, 0).
例如:
?- score_one_topic('Programming is fun',[programming-2,prolog-5,fun-2],Score).
Score=4