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

在SWI Prolog中,如何将一个字符串附加到第三个字符串中的另一个字符串?,prolog,declarative,Prolog,Declarative,在这个程序之前,我在下面的例子中看到,如果元素X属于字符串L 此示例的代码如下所示: member2(X, [X|_]). member2(X,[_|T]):- member2(X,T). 我有一个事实表示基本情况(如果X元素位于列表的头部,则X元素属于列表),如果X元素不是头部,则规则用于递归搜索列表的尾部 这个版本对我来说相当模糊,有人建议我用这种方式来理解它是如何工作的: member2(X, [X|_]). member2(X,Y):- Y = [_|T],

在这个程序之前,我在下面的例子中看到,如果元素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元素位于列表的头部,则它属于列表)

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

1) Y=[[uu | T]这是正确的,因为匿名变量u与任何事物相统一

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

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

解决办法是:

myappend([], L, L).
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).
我很难理解它是如何工作的

我知道这一事实代表了基本情况:当第一个参数是void list[]而第二个参数是not void list时,第一个参数和第二个参数的串联就是第二个参数list(这等于第三个参数)

该规则表示第一个参数不是无效列表的一般情况…因此我认为当这种情况发生时,它会删除L1参数的头(第一个列表的头),直到这是一个空列表[],因此我将使用基本情况,第三个参数统一到第二个参数…然后执行回溯

但我很难理解规则到底是如何运作的:

myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).
我正在尝试做一些类似于前面的例子的事情,并将其翻译成一种更具逻辑性的形式,因为这种方式对我来说非常不清楚……但我不知道如何做……我该怎么做

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

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
的串联。请注意,由于
[X | L1]
的约束,只有当第一个参数是一个列表且不为空时,它才能统一

您可以将谓词视为测试第一个、第二个和第三个参数是否具有第一个连接的关系,第二个连接是否为第三个参数。由于在Prolog中提取列表的头元素既简单又高效,上述解决方案选择第一个元素,匹配它们(
[X | L1]
[X | L]
),并测试其余元素是否满足连接关系。

连接([],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]。

mmm现在更清楚了,但一点也不清楚……您能帮我以扩展的形式编写它吗,就像我在previus示例中所做的那样?这是一个提示。如果您使用的是SWI Prolog,请键入trace.(启用跟踪),然后调用谓词myappend/3。(使用您自己的列表值)。看看会发生什么。事情应该变得更清楚。希望这有帮助。嗨,欢迎来到StackOverflow。您的答案有一些格式问题。请查看这篇关于如何更好地设置帖子格式的文章:)祝你好运