在SWI Prolog中,如何将一个字符串附加到第三个字符串中的另一个字符串?
在这个程序之前,我在下面的例子中看到,如果元素X属于字符串L 此示例的代码如下所示:在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],
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。您的答案有一些格式问题。请查看这篇关于如何更好地设置帖子格式的文章:)祝你好运