如何在Prolog中添加列表?

Zik*_*Zik 21 list concatenation append prolog

如何在Prolog中添加列表?我在互联网上搜索过,我找到了这个(来自http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html)

append([X|Y],Z,[X|W]) :- append(Y,Z,W).  
append([],X,X).
Run Code Online (Sandbox Code Playgroud)

所以它Z通过删除[X|Y]in 的元素得到[X|W].但是我如何将两个列表附加在一起?

例,

appendlist([1,2],[3,4,5],X).
Run Code Online (Sandbox Code Playgroud)

结果将是X = [1,2,3,4,5].

我也不知道递归中发生了什么.(我跟踪但不明白)

编辑:我想知道的是它应该如何编码以像append()Prolog中的预定义一样运行.

Wil*_*ess 27

您发布的代码(几乎)可以.只需要交换子句的顺序(为了使这个谓词定义有效,当以生成方式使用时):

append( [], X, X).                                   % your 2nd line
append( [X | Y], Z, [X | W]) :- append( Y, Z, W).    % your first line
Run Code Online (Sandbox Code Playgroud)

这定义了三个参数之间的关系,比方说A,BC.

你的第一行说," C是附加的结果AB是否AC非空列表,它们都具有相同的头部(即第一个元素),和C是附加的尾巴的结果A与同第二个参数,B".

  a        a
  ----------
  b        b
  c        c
  .    d   d
       e   e
       .   .
Run Code Online (Sandbox Code Playgroud)

或者从左到右:

         a | b c .
           |     d e .
         a | b c d e .

append(         [], 
                 Z,
                 Z ).       
append( [X | Y   ],
                 Z,
        [X |         W ] ) :- append(
             Y,  Z,  W).
Run Code Online (Sandbox Code Playgroud)

想一想,这很有道理.它的作用是,我们想要定义append/3关系,我们知道我们想要它是什么,所以我们只写下我们希望它实现的一些明显的事实,如果你愿意,它必须遵循的法律.

因此,假设我们已经为我们定义了此代码,那么必须遵循哪些法律?显然,将一些列表的尾部附加到另一个列表会给我们一个结果,即在第二个列表中附加完整列表.

这定义了我们如何"滑动"第一个列表.但是,如果没有更多的东西可以滑动呢?如果我们到达该列表的末尾怎么办?然后我们到达了空列表,并添加一个带有另一个列表的空列表,将结果列表作为结果.明显.这就是你的代码中的第二行告诉我们的内容,它说"将另一个列表附加一个列表会产生该列表作为结果".

令人惊讶的是,写下append/3必须遵循的这两条法则与写下定义本身是一样的.

另外:这从声明的角度解释了它; 请查看m09的答案,从操作的角度来看更多.


aio*_*obe 10

但是我如何将两个列表附加在一起?

你回答了自己的问题:你使用append/3.

如果你想追加XY存储结果Z,你可以

append(X, Y, Z)
Run Code Online (Sandbox Code Playgroud)

例如,如果X = [1, 2]Y = [3, 4, 5]随后Z将被绑定到[1, 2, 3, 4, 5]:

| ?- append([1,2],[3,4,5], X).

X = [1,2,3,4,5]

yes
| ?- 
Run Code Online (Sandbox Code Playgroud)

  • 你编码它的方式与'append`编码的方式相同!?您已经发现了实现(这是您问题中的前两行代码). (5认同)