在Prolog中从列表的前面取n个元素

在Prolog中从列表的前面取n个元素,prolog,Prolog,我是Prolog的初学者,我正在尝试编写谓词,当从列表前面获取n个元素时,这些谓词是正确的。这是我写的,似乎不起作用: take(N,List,Front):-length(Front,N),append(Front,[],List)。 我假设take(N,List,Front)为true,List和Front必须是相同的列表,这意味着append(Front,[],List)必须为true,Front必须为N,因此长度(Front,N)必须为true 现在,当我在解释器中尝试此操作时,我得到

我是Prolog的初学者,我正在尝试编写谓词,当从列表前面获取n个元素时,这些谓词是正确的。这是我写的,似乎不起作用:
take(N,List,Front):-length(Front,N),append(Front,[],List)。
我假设take(N,List,Front)为true,List和Front必须是相同的列表,这意味着
append(Front,[],List)
必须为true,Front必须为N,因此
长度(Front,N)
必须为true


现在,当我在解释器中尝试此操作时,我得到以下结果:
29?——参加(5、[1,2,3,4,5],马球)。

Polo=[1,2,3,4,5]

30?-取(3,[1,2,3,4,5],好的)。


false。

如果你想从
列表的前面获取
N
元素,就像从
List
尾部的前面获取
N-1
元素一样,将
列表的头钉在上面。毫不奇怪,从任何内容中提取0个元素都是一个空列表。(请记住,您可以将
列表解构为
[Head | Tail]

编辑:为什么
take(N,List,Front):-length(Front,N),append(Front,List)。

因为
length
append
做的事情与上面的非常相似<代码>长度(前面,N)
将使
前面
成为
[F1,F2,F3…FN]
,带有
N
未知数<代码>可以是任何东西,因此它可以是另一个包含一些未知项的列表。然后
append(Front,uu,List)
将两个未知列表连接起来,并将连接的每个元素等同于
List
的元素。例如,如果您有
N
as 2和
List
as
[1,2,3,4,5]
,则
append(Front,u,List)
将确保
[F1,F2,U1,U2,U3]
匹配
List

append([F1,F2],[1,2,3,4,5])
断言
F1=1
append([F2],[2,3,4,5])
。这表明
F2=2
append([],[3,4,5])
。这又是
append
的中断条件,它断言
.=[3,4,5]
,这是非常正确的。所以
Front=[F1,F2]=[1,2]


length
构造
[F1,F2]
的方式类似:
length(First,2)
断言
length(FirstTail,1)
,这断言
length(FirstTailTail,0)
,这是中断条件,因此
FirstTailTail=[]
,这使得
First=[F1 |[F2 |]]]=[F1,F2]

谢谢,这肯定会奏效,但由于某种原因,如果我更改take(N,List,Front):-length(Front,N),append(Front,[],List)。获取(N,列表,前面):-length(前面,N),append(前面,列表)。它很好用。有人能解释一下原因吗?我指的是这个:take(N,List,Front):-length(Front,N),append(Front,uu,List)。谢谢你的解释,这让它更清楚了。