Recursion 递归附加列表
这里有一个片段:Recursion 递归附加列表,recursion,prolog,append,Recursion,Prolog,Append,这里有一个片段: translate("a", "4"). translate("m", "/\\/\\"). tol33t([], []). tol33t([Upper|UpperTail], [Lower|LowerTail]) :- translate([Upper], [Lower]), tol33t(UpperTail, LowerTail). 基本上,我想做的是在表中查找一封信,然后获取该信并将其添加到新列表中 如果它是一个字符,我所拥有的就可以了,但我不确定如何
translate("a", "4").
translate("m", "/\\/\\").
tol33t([], []).
tol33t([Upper|UpperTail], [Lower|LowerTail]) :-
translate([Upper], [Lower]),
tol33t(UpperTail, LowerTail).
基本上,我想做的是在表中查找一封信,然后获取该信并将其添加到新列表中
如果它是一个字符,我所拥有的就可以了,但我不确定如何将新的字符列表附加到旧的字符列表中
输入示例:
l33t(“was”,L)。
它将通过如下方式实现:
l33t([119,97115],L)
现在这应该是:
[92,47,92,47]++[52]+[53]或[92,47,92,47,52,53]
问题是我不知道如何像那样附加它。考虑一下对
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).
第一个子句是基本情况
如果通过translate/2
对当前code
进行翻译,并将其作为任意长度的字符列表(translation
-请注意,您的[Lower]
将结果限制为长度为1的列表),则第二个子句将成功。检查代码翻译后的剪切(!
)承诺递归地查找解决方案的剩余部分
,然后将翻译部分
追加到前面,作为剩余部分
返回
如果第二个子句中当前的code
(即调用translate/2
)没有翻译,则执行第三个子句。在这种情况下,代码没有翻译意味着我们只返回原样并计算其余部分
编辑:
如果没有cut(!
),第二和第三个子句可以组合成:
tol33t([Code|Codes], Remainder) :-
tol33t(Codes, Rest),
(translate([Code], Translation) ->
append(Translation, Rest, Remainder)
; Remainder = [Code|Rest]
).
此(未优化)版本在字符列表中的每个code
处检查是否有成功的translate/2
;如果是这样,则翻译
被附加到其余部分
,否则将原封不动地传递代码。请注意,这与上面的实现具有相同的语义,因为如果->
(translate/2
)的先行项成功,则会提交解决方案(即,模拟切割!
)。注意,两种实现中的切入都是严格必要的;如果没有它,程序将回溯到存在适用的translate/2
子句的code
绑定未翻译的解决方案。考虑对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).
第一个子句是基本情况
如果通过translate/2
对当前code
进行翻译,并将其作为任意长度的字符列表(translation
-请注意,您的[Lower]
将结果限制为长度为1的列表),则第二个子句将成功。检查代码翻译后的剪切(!
)承诺递归地查找解决方案的剩余部分
,然后将翻译部分
追加到前面,作为剩余部分
返回
如果第二个子句中当前的code
(即调用translate/2
)没有翻译,则执行第三个子句。在这种情况下,代码没有翻译意味着我们只返回原样并计算其余部分
编辑:
如果没有cut(!
),第二和第三个子句可以组合成:
tol33t([Code|Codes], Remainder) :-
tol33t(Codes, Rest),
(translate([Code], Translation) ->
append(Translation, Rest, Remainder)
; Remainder = [Code|Rest]
).
此(未优化)版本在字符列表中的每个code
处检查是否有成功的translate/2
;如果是这样,则翻译
被附加到其余部分
,否则将原封不动地传递代码。请注意,这与上面的实现具有相同的语义,因为如果->
(translate/2
)的先行项成功,则会提交解决方案(即,模拟切割!
)。注意,两种实现中的切入都是严格必要的;如果没有它,程序将回溯到存在适用的translate/2
子句时,code
绑定未翻译的解决方案。。问题是我不能使用剪切,所以这就是为什么我一直被Stuck的原因。实际上,如果不检查翻译是否存在,这应该是可以的。谢谢啊哈。。。如果不能使用剪切,可以使用->
。我将在编辑中添加代码。我已经做了一些与您所做的非常接近的事情。问题是我不能使用剪切,所以这就是为什么我一直被Stuck的原因。实际上,如果不检查翻译是否存在,这应该是可以的。谢谢啊哈。。。如果不能使用剪切,可以使用->
。我将在编辑中添加代码。