Prolog中使用concat的3个连续元素

Prolog中使用concat的3个连续元素,prolog,Prolog,所以我正在解决这个问题,让3个X元素在一个列表中是连续的,并且只能使用concat 以下是我的尝试: threeConsecutive(X, L):- concat(X, X, L2), concat(L2, X, L). 这是正确的吗?如果没有,你能解释一下我做错了什么吗?从我的角度来看,我连接了2个X元素,并将它们放入另一个名为L2的自由变量中,然后将其与元素X再次连接。最后,我将其存储在原始列表L中 如果有人能检查一下,我将不胜感激,因为我正试图在Prolog中理解concat的概念 谢

所以我正在解决这个问题,让3个X元素在一个列表中是连续的,并且只能使用concat

以下是我的尝试:

threeConsecutive(X, L):- concat(X, X, L2), concat(L2, X, L).
这是正确的吗?如果没有,你能解释一下我做错了什么吗?从我的角度来看,我连接了2个X元素,并将它们放入另一个名为L2的自由变量中,然后将其与元素X再次连接。最后,我将其存储在原始列表L中

如果有人能检查一下,我将不胜感激,因为我正试图在Prolog中理解concat的概念


谢谢大家!

您所要做的就是使用模式匹配:

?- append(_, [X,Y,Z|_], [a,b,c,d,e,f]).
X = a, Y = b, Z = c ;
X = b, Y = c, Z = d ;
X = c, Y = d, Z = e ;
X = d, Y = e, Z = f ;
false.
append/3
为您执行回溯

如果要将这三个元素包含在各自的列表中,可以使用两个调用
append/3

append(_, Suffix, List), append([X,Y,Z], _, Suffix)
至于如何制作包含三个元素的列表:只需说
list=[X,Y,Z]
。要列出任何长度,您甚至可以使用
length(list,Len)
,例如
length(list,3)

而且,如果您需要三个变量相同(如中所示,统一它们),那么只需使用相同的变量:
List=[X,X,X]

这是正确的吗

不,第一个问题是append/3(为了便于讨论,假设未定义的concat/3是append/3)表示3个列表之间的关系。所以

连接2个X元素并将它们放入另一个名为L2的自由变量中

应该是

concat([X], [X], L2)
这可以用统一来更好地表达,如

[X,X] = L2
同样的问题也适用于中国

..., concat(L2, X, L).
应该是concat(L2,X,L)

然后你可以看到整个代码会减少到

threeConsecutive(X, [X,X,X]).

因此,第二个问题很明显,但由于@Boris answer已经显示了所需的正确模式,我将避免在这里重复它。

这里最重要的是如何定义
concat/3
。是不是有些变化?嗨@Boris,是的,问题是关于append*对不起,我只是用了concat,因为这是我通常看到的。@false我误读了这个问题,所以我回答了错误的问题,没有时间解决it@Boris当前位置不管接受分数是多少,我都认为你的答案是正确的。只有老师会说:-)。但是在列表中。。。你需要什么did@false好了,好了。我现在要问的问题是,我的问题中的参数是连续的(X,L)-我的解是正确的还是错误的?希望您能回复,再次感谢。@user41580为什么不试试您的解决方案呢?它应该很明显是正确的还是错误的。这闻起来很像家庭作业,所以我不想给出一个完整的答案。无论如何,我在我的答案中添加了更多的细节。嗨@Boris,这不是家庭作业,但这是我教科书中的一个问题,我正在努力解决以提高。我想我有点理解你的意思:append([X,Y,Z],[uu,L)@user41580不,这是错误的:
append([X,Y,Z],[uu,L)
的意思是“L是一个列表,X,Y,Z是它的前三个元素。”你似乎在后面的是任何连续的三个元素,这是
append([X,Y,Z,[u124;],L)
,如答案所示!当你说“第二个问题很明显”时,你指的是什么?谢谢。对不起,也许我的问题有点含糊。主要问题是连续三次追加X。append(,[X,Y,Z |],L)似乎只适用于3个不同的连续元素。这就是为什么我多次尝试使用X。。。你能解释一下我需要做什么才能连续三次追加X并将其放入列表中吗?谢谢。第二个问题是,你被要求在一个列表中定位一个模式,但是你的代码——一旦更正——将匹配整个列表。要重复X三次,只需“声明”它
[X,X,X |]
在模式中伟大的回答,@capelical,我正在玩弄它,我相信我现在已经弄明白了。我最初编写了[X,X,X | uu],但当我通过SWI Prolog运行它时,每次我的答案都会返回false(因为我的列表不正确-我只提供了不同的变量)。不过我现在拿到了。非常感谢你的帮助。
threeConsecutive(X, [X,X,X]).