我正在尝试编写两个谓词。它们将用给定的输入元素替换列表的第二个或倒数第二个元素。到目前为止,我只能替换列表的第一个元素或在第二个位置插入。我是Prolog的新手,我在理解回溯和递归方面遇到了一些困难。任何人都可以帮我这个吗?我真正想要理解的答案越多越好。
我这样打电话:repl([1,2,3,4,5], new, Y).
,我正在努力让结果Y = [1,new,3,4,5]
回来。我也试图做同样的事情来替换倒数第二个,比如:repl2([1,2,3,4,5], new, Y).
我要返回Y = [1,2,3,new,5]
。
到目前为止,我所尝试的是
repl([_], X, [X]).
repl([H|T], X, [H,X|T])
我知道这是非常错误的原因很多。我尝试了很多不同的东西,但正如我提到的这种语法,这种回溯和递归至少可以说令人难以置信。
答案 0 :(得分:2)
正如您已经弄明白的那样,对于repl/3
谓词,定义是:
repl([H,_|T], A, [H,A|T]).
在上面的定义中,请注意下划线(在您的定义中,您有一个变量X,使用下划线来静音单例警告)。
对于您可以写的repl2/3
定义:
repl2(L, A, OutL):-reverse(L, [H,_|T]), reverse([H,A|T], OutL).
示例:
?- repl2([1,2,3,4,5], new, Y).
Y = [1, 2, 3, new, 5].