试图替换prolog中列表的第二个或第二个元素

时间:2018-03-30 16:00:23

标签: list prolog

我正在尝试编写两个谓词。它们将用给定的输入元素替换列表的第二个或倒数第二个元素。到目前为止,我只能替换列表的第一个元素或在第二个位置插入。我是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]) 

我知道这是非常错误的原因很多。我尝试了很多不同的东西,但正如我提到的这种语法,这种回溯和递归至少可以说令人难以置信。

1 个答案:

答案 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].