将原子转换为大写(或小写)[SICStus]

时间:2016-01-19 11:03:41

标签: prolog

我想用这个谓词将小写原子转换为大写(反之亦然):

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但哪一行必须由它们取代?

帮助

2 个答案:

答案 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)