如何在prolog中实现toLowerCase?

时间:2017-11-23 02:51:58

标签: string list prolog return ascii

所以我试图在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).

1 个答案:

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