перебрать алфавит в прологе - PullRequest
0 голосов
/ 28 марта 2011

Допустим, я хочу иметь какое-то правило для сравнения, подобное

isin(0,_).
isin(N,List) :- member(N,List), write(N), N1 is N-1, isin(N1,List).

, но список будет содержать символы алфавита (например, [a, b, d, e, h]).Как я могу отправить следующий элемент на итерацию?(так что N это символ, а не число).И если это невозможно, как я могу сделать что-то похожее?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 28 марта 2011

@ julkiewicz почти там:

isin(a, _).
isin(Char, List) :-
    member(Char, List),
    char_code(Char, Code),
    write(Char),
    Code1 is Code-1,
    char_code(Char1, Code1),
    isin(Char1, List).

Обратите внимание, что предикат всегда будет успешным на a, так же, как ваша оригинальная версия всегда будет успешной на 0.Вы можете предотвратить это, изменив базовое предложение на что-то вроде

isin(Char, _) :-
    char_code(a, A),
    Char is A-1.

(но это действительно уродливый хак.)

2 голосов
/ 28 марта 2011

ПРИМЕЧАНИЕ. Это работает со строками, а не с символами, как требует OP.

Что ж, похоже, символы действительно интерпретируются как списки чисел.Так что это работает:

?- X = "a".
X = [97].
?- X is "a".
X = 97.
?- X is "a" + 1.
X = 98.

Вот что я бы предложил:

isin("a", _).
isin(N, List) :- member(N, List), N1 is N - 1, isin([N1], List).

Хотя давно ничего не писал на этом языке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...