Проверьте, является ли атом строчной буквой - PullRequest
1 голос
/ 31 марта 2011

Я делаю это так:

foo(N) :-
        name(N, [Code]),
        name(a, [CodeA]),
        name(z, [CodeZ]),
        CodeA =< Code,
        Code  =< CodeZ.

Есть ли способ, который не похож на такой трудоемкий?

Ответы [ 2 ]

3 голосов
/ 31 марта 2011
atom_is_lower(N) :-
    atom_chars(N, [L]),
    char_type(L, lower).
  • atom_chars преобразует атом в список символов.
  • char_type проверяет тип символа.

Обратите внимание, что вторая часть (char_type) необходима, потому что атом из одного символа может быть числом (например).

0 голосов
/ 31 марта 2011

Одним из вариантов является использование встроенного char_type/2, и если он сталкивается с ошибкой типа (например, когда длина ввода превышает один символ) и выдает исключение, то преобразует исключение в сбой.

atom_is_lower(Atom) :-
    catch(char_type(Atom, lower), _, fail).

Это решение также может генерировать строчные буквы:

?- atom_is_lower(A).
A = a ;
A = b ;
A = c ;
A = d ;
A = e ;
...
...