Sicstus Prolog - вес слова - PullRequest
       13

Sicstus Prolog - вес слова

2 голосов
/ 19 сентября 2011

У меня проблема с тем, как взвесить слово. Каждая буква в слове имеет определенный вес, мне нужно рассчитать общий вес слова. Например:

A-E = 1,  F-O = 2, P-Z = 3.

Если слово «PEN», ответом будет «Вес = 6»,

cuz P = 3, E = 1 and N = 2.

Я пробовал:

word_weight([X], W):-
    X = 65 -> W = 1;
    X = 66 -> W = 3.
word_weight([X,Y],W):-
    X = 65 -> W1 = 1;
    X = 66 -> W1 = 3,
    Y = 65 -> W2 = 1;
    Y = 66 -> W2 = 3,
    W is W1 + W2.
word_weight([X|Y], W):-
    X = 65 -> W = 1;
    X = 66 -> W = 3,
    word_weight(Y, W).

Запуск Res: | ? - word_weight ("B", W).
W = 3? да

Работает только с одной буквой. Как сделать так, чтобы он работал со многими буквами? И ответами будет общее значение веса.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Следующая программа работает с SWI-Prolog. Конечно, его легко адаптировать к Sicstus Prolog.

char_weight(C, 1) :- C >= 65, C =< 69.
char_weight(C, 2) :- C >= 70, C =< 79.
char_weight(C, 3) :- C >= 80, C =< 90.

word_weight([], 0). 
word_weight([Char| Chars], Weight) :- 
    char_weight(Char, W), 
    word_weight(Chars, Ws),
    Weight is W + Ws. 
2 голосов
/ 19 сентября 2011

Как насчет

weight(C, 1) :- char_code('A') =< C, C =< char_code('E').
weight(C, 2) :- char_code('F') =< C, C =< char_code('O').
weight(C, 3) :- char_code('P') =< C, C =< char_code('Z').

word_weight(S, W) :- string(S), !, string_list(S, L), word_weight(L, W).
word_weight([], 0).
word_weight([H|T], W) :- W is weight(H) + word_weight(T).

в ECLiPSe-CLP, string_list / 2 преобразует строку в список числовых кодов символов, char_code / 2 получает числовой код символа.

Edit: К сожалению, я должен был полностью прочитать ваш вопрос:

  • Если вы используете ->/2, вам следует использовать скобки и не стесняйтесь использовать отступы: ( Condition -> IfBranch ; ElseBranch ), RestProg. Ваше второе предложение немного нечитаемо. Но для этого упражнения вам вообще не нужен ->/2.
  • Ваше третье предложение работает только для однобуквенной строки, потому что оно сначала объединяет W со значением для X, а затем хочет объединить W с весом X. Это работает, только если Y и X имеют одинаковый вес.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...