String 如何在prolog中实现toLowerCase?

String 如何在prolog中实现toLowerCase?,string,list,prolog,return,ascii,String,List,Prolog,Return,Ascii,所以我试图在prolog中实现一个toLowerCase,但是我非常不确定如何返回,甚至如何处理字符串和列表。似乎所有的条件都是有规则的,但是我不能让它工作,所以我实际上返回了一个字符串。我一直认为这是真的,没有返回字符串。到目前为止,这是我的代码 isUpper(H):- H > 64, H < 98. toLowerH(H,R):- isUpper(H), R is H + 32. toLowerH(_,_). toLowerCase([], _). to

所以我试图在prolog中实现一个toLowerCase,但是我非常不确定如何返回,甚至如何处理字符串和列表。似乎所有的条件都是有规则的,但是我不能让它工作,所以我实际上返回了一个字符串。我一直认为这是真的,没有返回字符串。到目前为止,这是我的代码

isUpper(H):-
    H > 64, H < 98.

toLowerH(H,R):-
   isUpper(H),
   R is H + 32.
toLowerH(_,_).

toLowerCase([], _).
toLowerCase([H|T], L):-
     toLowerH(H,R), toLowerCase(T,L).

为什么它不返回任何内容:

toLowerCase([], _).
这意味着空列表空字符串的小写等价物可以是任何内容。显然这不是真的-它也应该是一个空列表

将其更改为toLowerCase[],[]后,结果将始终为空列表。这是因为您从未实际使用从toLowerHH,R中获得的R。您还应该得到一个关于singleton变量的警告,它指出了问题所在。让我们解决这个问题:

toLowerCase([H|T], [R|L]):-
     toLowerH(H,R), toLowerCase(T,L).
或者,您可以将整个构造替换为一个:

很好,现在我们得到了输出,但仍然不正确。具体来说,对于非大写的输入字母,输出将是一个自由变量,即一些未指定的值。对于大写输入,将有两个成功的路径:一个导致小写版本,另一个带有自由变量

罪魁祸首是托洛夫。。这本质上说,任何东西都可以是任何东西的小写版本。你真正想说的是,某些东西是它本身的小写版本,如果它已经是小写的话。假设任何不是大写的东西都被认为是小写,我们可以这样写

toLowerH(L,L):- \+(isUpper(L)).
现在我们得到了一个输出,所有大写字母都被小写字母所取代

还要注意,目前小写字母a(代码97)被识别为大写字母。您可能需要相应地更新边界

最终结果如下所示:

isUpper(H):-
    H > 64, H < 97.

toLowerH(H,R):-
   isUpper(H),
   R is H + 32.
toLowerH(L,L):- \+(isUpper(L)).

toLowerCase(U, L) :- maplist(toLowerH, U, L).

什么是maplist?@christian它将谓词toLowerH应用于U和L中的每一对元素-或者更简单地说,它将toLowerH应用于U中的每一个元素,并将结果存储在L中。这基本上是一种较短的方法,可以编写与以前相同的内容。哦,好的,这是一个方便的函数。谢谢你的帮助,不幸的是,我仍然是prolog的新手。
isUpper(H):-
    H > 64, H < 97.

toLowerH(H,R):-
   isUpper(H),
   R is H + 32.
toLowerH(L,L):- \+(isUpper(L)).

toLowerCase(U, L) :- maplist(toLowerH, U, L).
?- atom_codes('TEsT abc DEF 123456', _U), toLowerCase(_U, _L), atom_codes(O, _L).
O = 'test abc def 123456';
false.