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的原因。实际上,如果不检查翻译是否存在,这应该是可以的。谢谢啊哈。。。如果不能使用剪切,可以使用
->
。我将在编辑中添加代码。