如何在Prolog中添加列表?

时间:2012-07-18 10:22:32

标签: list prolog append concatenation

如何在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).

通过移除Z[X|Y]的元素,它获得了[X|W]。但是我如何将两个列表附加在一起?

实施例,

appendlist([1,2],[3,4,5],X).

结果为X = [1,2,3,4,5]

此外,我不知道递归中发生了什么。 (我跟踪但不明白)

编辑:我想知道的是如何将其编码为与Prolog中预定义的append()一样的功能。

2 个答案:

答案 0 :(得分:27)

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

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

这定义了三个参数之间的关系,比如ABC

您的第一行说,如果CA是非空列表,B是附加AC的结果,它们都有相同的(即第一个元素),而C是附加A的尾部的结果相同的第二个参数B

  a        a
  ----------
  b        b
  c        c
  .    d   d
       e   e
       .   .

或者从左到右:

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

append(         [], 
                 Z,
                 Z ).       
append( [X | Y   ],
                 Z,
        [X |         W ] ) :- append(
             Y,  Z,  W).

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

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

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

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

补充:这从声明的角度解释了它;查看an answer by m09,从操作的角度来看更多。

答案 1 :(得分:10)

  

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

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

如果您要追加XY并将结果存储在Z,则可以

append(X, Y, Z)

如果例如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
| ?-