Я делаю это так:
foo(N) :-
name(N, [Code]),
name(a, [CodeA]),
name(z, [CodeZ]),
CodeA =< Code,
Code =< CodeZ.
Есть ли способ, который не похож на такой обходной путь?
Я делаю это так:
foo(N) :-
name(N, [Code]),
name(a, [CodeA]),
name(z, [CodeZ]),
CodeA =< Code,
Code =< CodeZ.
Есть ли способ, который не похож на такой обходной путь?
atom_is_lower(N) :-
atom_chars(N, [L]),
char_type(L, lower).
Обратите внимание, что вторая часть (char_type) необходима, потому что односимвольный атом может быть числом (например).
Один из вариантов — использовать встроенный 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 ;
...