我想用这个谓词将小写原子转换为大写(反之亦然):
to_upper([], []) :-
!.
to_upper([LC|LCAtom], [U|UAtom]) :-
UC is LC-32,
char_code(U, UC), % <-
% List = [UC|UAtom],
to_upper(LCAtom, UAtom).
% atom_codes(Result, List),
结果:
| ?- to_upper("abc", X).
X = ['A','B','C'] ? ;
no
我的问题是输出必须像这个X = 'ABC'.
而不是列表,我认为atom_codes/2
解决了这个prb但哪一行必须由它们取代?
帮助
答案 0 :(得分:1)
我在另一个答案中表明了一种更清洁(imho)的可能性:
% if uppercase get lowercase
upper_lower(U, L) :-
between(0'A, 0'Z, U), L is 0'a + U - 0'A.
make_lower(C, L) :- upper_lower(C, L) ; L = C.
可以直接使用,也可以从实用程序模块导出。只要给它一个你喜欢的名字。
?- maplist(make_lower, "UpperCase", Codes),format('~s~n', [Codes]).
注意:使用 - so basic - maplist / N,我们应该能够使用 far 更多声明性的CLP(FD)库:
upper_lower(U, L) :-
U #>= 0'A, U #=< 0'Z, L #= U - 0'A + 0'a.
答案 1 :(得分:0)
代码:
%lowercase to uppercase
to_upper(Atom,UAtom) :- atom_codes(Atom,CList),
( foreach(C,CList),
fromto(Res,Out,In,[])
do
between(97,122,C), % is_upper
C1 is C-32,
Out=[C1|In]
),
atom_codes(UAtom,Res).
% uppercase to lowercase
to_lower(Atom,LAtom) :- atom_codes(Atom,CList),
( foreach(C,CList),
fromto(Res,Out,In,[])
do
between(65,90,C), % is_lower
C1 is C+32,
Out=[C1|In]
),
atom_codes(LAtom,Res).
结果:
| ?- to_upper(abc,X).
X = 'ABC' ? ;
no
| ?- to_lower('ABC',X).
X = abc ? ;
no
| ?-
注意:使用to_lower / 2你需要在' '
之间放置原子
编辑代码:
转换原子结构
char_to_lower(L,UChar) :- % <=> char_to_lower(-32)
between(0'A, 0'Z, L)->
UChar is L+32 ;
UChar=L.
atom_to_lower(Atom,Res) :- % <=> atom_to_upper
atom_codes(Atom,Codes),
maplist(char_to_lower,Codes,LCodes),
atom_codes(Res,LCodes).
测试原子是否为大写
is_upper(Atom) :- atom_codes(Atom,Codes),
(
foreach(C,Codes)
do
\+between(0'a, 0'z, C)-> true;
fail,!
).
测试原子是否为小写
is_lower(Atom) :- \+is_upper(Atom),!. % \+ <=> NOT(pred/N)
从列表中获取上下原子
get_upper(List,List_Upper) :- include(is_upper,List,List_Upper).
get_lower(List,List_Lower) :- include(is_lower,List,List_Lower).
% exclude(get_upper,List,List_Lower)
% get_upper_lower(+List,?ListUpper,?ListLower)
get_upper_lower(List, List_Upper,List_Lower) :- get_upper(List,List_Upper),
get_lower(List,List_Lower).
% get_lower/2 <=> exclude(get_upper,List,List_Lower)