递归附加列表

时间:2010-10-23 00:55:32

标签: recursion prolog append

Heres一个片段:

translate("a", "4").
translate("m", "/\\/\\").

tol33t([], []).
tol33t([Upper|UpperTail], [Lower|LowerTail]) :-
    translate([Upper], [Lower]),
    tol33t(UpperTail, LowerTail).

基本上我想要做的是在表格中查找一封信,然后获取该信并将其添加到新列表中。

如果它是一个角色,我的作品是什么,但我不知道如何用新的字符附加新的字符列表。

示例输入:

l33t(“是”,L)。 它会像这样通过: l33t([119,97,115],L)。

现在应该回来: [92,47,92,47] ++ [52] ++ [53]或[92,47,92,47,52,53]

问题是我不知道如何追加它。

1 个答案:

答案 0 :(得分:3)

考虑对tol33t/2

的这些修改
tol33t([], []).
tol33t([Code|Codes], Remainder) :-
    translate([Code], Translation), !,
    tol33t(Codes, Rest),
    append(Translation, Rest, Remainder).
tol33t([Code|Codes], [Code|Remainder]) :-
    tol33t(Codes, Remainder).

第一个条款是基本案例。

如果当前Code通过translate/2翻译,则第二个子句会成功,作为任意长度的字符列表(Translation - 请注意您{{1}相反,它将结果限制为仅限长度为1的列表。检查代码转换后的剪切([Lower])会提交以递归方式查找解决方案的!,然后将Rest添加到前面,作为Translation到返回。

如果第二个子句中没有当前Remainder的翻译(即对Code的调用),则执行第三个子句。在这种情况下,translate/2没有翻译意味着我们只是按原样返回并计算其余部分。

修改

如果你没有剪切(Code),第二和第三个条款可以组合成:

!

这个(未经优化的)版本会在字符列表中的每个tol33t([Code|Codes], Remainder) :- tol33t(Codes, Rest), (translate([Code], Translation) -> append(Translation, Rest, Remainder) ; Remainder = [Code|Rest] ). 处检查,如果,则有Code超过;如果是这样,则translate/2会附加到Translation其他 Rest会保持不变。请注意,这与上面的实现具有相同的语义,因为如果前导Code!)成功,则提交解决方案(即模拟剪切->)。请注意,两种实现中的切割都是必要的;如果没有它,程序将回溯以找到在存在适用的translate/2子句的情况下未转换Code绑定的解决方案。