Определенный раздел Грамматики, как проверить, является ли строка символом?

Мне кажется, это хорошо, но это всегда дает ложь... и я не могу понять, почему.

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 также удастся для других условий.

Другие вопросы по тегам