在Prolog中从列表的前面取n个元素
我是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 现在,当我在解释器中尝试此操作时,我得到
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)。谢谢你的解释,这让它更清楚了。