【问题标题】:Trying to replace second or second last element of lists in prolog尝试替换序言中列表的第二个或倒数第二个元素
【发布时间】:2018-03-30 16:00:23
【问题描述】:

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

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

【问题讨论】:

  • 当列表为空或只有一个元素时,您期望什么?例如repl([],new,Y)应该成功还是失败??
  • 我能够找出第一个。 repl([H,X|T], A, [H,A|T]). 这对我有用。如果 list 是 0 或 1 个元素,则返回 false。那是对的吗?或者我也应该有一个空列表的案例吗?如果列表为空或只有一个元素,我希望它始终返回 false
  • 既然你想在列表长度为 0,1 的情况下返回 false,那么它很好。如果您觉得困难,我会给出第二个答案...?

标签: list prolog


【解决方案1】:

正如您已经知道的那样,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].

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多