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]
问题是我不知道如何追加它。
答案 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
绑定的解决方案。