所以我试图在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).
答案 0 :(得分:1)
为什么它没有&#34;返回&#34;任何东西:
toLowerCase([], _).
这表示空列表(空字符串)的小写等价物可以是任何东西。显然这不是真的 - 它也应该是一个空列表。
将此更改为toLowerCase([], []).
后,结果将始终为空列表。这是因为您实际上从未使用R
中的toLowerH(H,R)
。您还应该收到有关单例变量的警告,该变量指向问题。让我们解决一下:
toLowerCase([H|T], [R|L]):-
toLowerH(H,R), toLowerCase(T,L).
或者,您可以使用单个maplist\3
替换整个构造:
toLowerCase(U, L) :- maplist(toLowerH, U, L).
很好,现在我们正在获得输出,但它仍然不正确。具体地说,对于不是大写的输入字母,输出将是自由变量(即一些未指定的值)。对于大写的输入,将有两个成功的路径:一个产生小写版本,一个产生自由变量。
罪魁祸首是toLowerH(_,_).
。这基本上说任何东西都可以是任何东西的小写版本。你真正想要说的是,如果它已经是小写的话,它本身就是小写版本。假设任何不是大写的东西都被视为小写,我们可以将其写为
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).
例如查询:
?- atom_codes('TEsT abc DEF 123456', _U), toLowerCase(_U, _L), atom_codes(O, _L).
O = 'test abc def 123456';
false.