Определенный раздел Грамматики, как проверить, является ли строка символом?
Мне кажется, это хорошо, но это всегда дает ложь... и я не могу понять, почему.
letter(X) --> [C], {"a"=<C, C=<"z", name(X,[C])}.
Спасибо.
1 ответ
Самый простой способ - убедиться, что ваша грамматика получает символы с самого начала. В этой ситуации вам не нужно использовать name/2
(или скорее char_code/2
) для конвертации.
:- set_prolog_flag(double_quotes, chars).
letter(C) --> [C], { atom_length(C,1), a @=< C, C @=< z }.
Это должно работать в любой системе. В SWI есть также char_type/2
:
letter(C) --> [C], { atom_length(C,1), char_type(C, lower) }.
Это будет также принимать и другие символы нижнего регистра, кроме умных слов.
Отметьте цель atom_length(C,1)
который гарантирует, что есть только символы. Иначе, letter//1
также удастся для других условий.