如何将字符串附加到SWI Prolog中的第三个字符串中的另一个字符串?

时间:2012-12-20 14:31:36

标签: prolog declarative

在此程序之前,我在下面的示例中看到过,如果元素X属于字符串L。

此示例的代码如下:

member2(X, [X|_]).
member2(X,[_|T]):- member2(X,T).

我有一个事实代表基本情况(如果X元素位于列表的头部,则X元素属于列表)并且如果元素X不是,则规则用于递归搜索列表的尾部头......

这个版本对我来说非常模糊,有人建议我以这种方式看待它以了解它是如何工作的:

member2(X, [X|_]).
member2(X,Y):- Y = [_|T],
               member2(X,T).

所以意思更明确:

我有一个事实代表基本情况(如果X元素位于列表的头部,则X元素属于列表)。

规则说我必须证明两件事:

1)Y = [_ | T]这是真的,因为匿名变量_与任何东西结合

2)它递归搜索尾部列表中的元素X

好的,现在我有一个问题需要理解这个新练习,我必须写一个SWI Prolog程序,给定两个字符串,将第二个字符串连接到第三个字符串中的第一个

解决方案是:

myappend([], L, L).
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).

我有一些问题需要了解它是如何工作的

我理解事实代表基本情况:当第一个参数是void list []而第二个参数是not void list时,第一个参数和第二个参数的串联是第二个参数列表(和这相当于第三个参数)

规则表示第一个参数不是空列表的一般情况......所以我认为当这种情况发生时它会删除L1参数的头部(第一个列表的头部),直到这个为空list [],所以我将有基本情况,第三个参数统一到第二个...然后做回溯......

但是我有一个问题是要理解规则的确切运作方式:

myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).

我正在尝试做一些像上一个例子那样的东西并用更多的说话逻辑形式翻译它,因为这种方式对我来说很不清楚......但是我没有想法怎么做......我该怎么办?

这条规则背后的逻辑是什么?这是什么意思?

2 个答案:

答案 0 :(得分:1)

myappend([], L, L).

myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).

第二条规则的较长版本:

myappend(L1, L2, Concat) :- 
    L1 = [HeadL1|RestL1], Concat = [HeadConcat|RestConcat], 
    HeadL1 = HeadConcat,
    myappend(RestL1,L2,RestConcat).

第一条规则意味着,如果第一个列表为空,则连接列表与第二个列表相同。

第二个规则意味着,最终列表将由第一个列表X的第一个元素和列表L组成,列表L1是第一个列表的其余部分L2的串联1}}和第二个列表[X|L1]。请注意,由于[X|L1]的约束,第一个参数只有在它是一个列表并且它不为空时才能统一。

您可以将谓词视为测试第1,第2和第3个参数是否具有第1和第2个连接的关系是第3个参数。由于在Prolog中提取列表的head元素非常简单有效,因此上面的解决方案选出第一个元素,匹配它们([X|L]和{{1}})并测试其余元素是否满足连接关系。

答案 1 :(得分:-1)

连接([],L,L)。

连接([X | L1],L2,[X | L]): - 连接(L1,L2,L)。

这里我们在现有列表的末尾添加元素/列表。

连接(现有列表,元素,[现有列表|元素])

1 - >如果列表为空,则连接列表将是第二个列表。  以第二个陈述为例: 现有清单= [1,2]
添加元素3

连接([X | L1],L2,[X | L]): - 连接(L1,L2,L)。

连接([1 | 2],3,[1 | x]): -

连接([2],3,[2 | y]): - (x = [2 | y];)

连接([],3,3)。 (y = 3;)

因此最终列表变为[1,2,3]。