prolog - 如果错误则继续递归

时间:2016-06-07 23:38:10

标签: recursion prolog

我正在写这段代码:

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,有没有办法继续递归?

2 个答案:

答案 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