Проверить, является ли атом строчной буквой

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

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

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


person Koen    schedule 31.03.2011    source источник


Ответы (2)


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

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

person mgiuca    schedule 31.03.2011
comment
ссылки видимо битые :( - person Joe; 14.05.2013

Один из вариантов — использовать встроенный 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 ;
...
person Kaarel    schedule 31.03.2011