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

take n elements from the front of the list in Prolog

我是 Prolog 的初学者,我正在尝试编写在从列表前面获取 n 个元素时适用的谓词。这是我写的,但似乎不起作用:
take(N, List, Front):- length(Front, N), append(Front, [], List). 我假设要使 take(N, List, Front) 成立,List 和 Front 必须是相同的列表,这意味着 append(Front, [], List) 必须成立,并且 Front 的大小必须为 N,因此 length(Front, N) 必须坚持下去。


现在,当我在解释器中尝试这个时,我得到以下信息:
29 ?- take(5, [1,2,3,4,5], Polo).
Polo = [1, 2, 3, 4, 5]
30 ?- take(3, [1,2,3,4,5], Ok).
false.

如果要从List的前面取N个元素,就像从[=11=的尾部前面取N - 1个元素一样,用List 的头钉上了。毫不奇怪,从任何东西中取出 0 个元素都是一个空列表。 (请记住,您可以将 List 解构为 [Head | Tail]。)

编辑:为什么 take(N, List, Front):- length(Front, N), append(Front, _, List). 有效?

因为 lengthappend 都做了与上面非常相似的事情。 length(Front, N) 将使 Front 变为 [F1, F2, F3... FN],其中 N 个未知数。 _ 可以是任何东西,所以它可以是另一个带有一些未知数的列表。然后 append(Front, _, List) 连接两个未知数列表,并将连接的每个元素等同于 List 的元素。例如,如果 N 为 2,List[1, 2, 3, 4, 5],则 append(Front, _, List) 将确保 [F1, F2, U1, U2, U3] 匹配 List

append([F1, F2], _, [1, 2, 3, 4, 5]) 断言 F1 = 1append([F2], _, [2, 3, 4, 5])。这断言 F2 = 2append([], _, [3, 4, 5])。反过来,这就是 append 的中断条件,它断言 _ = [3, 4, 5],这通常是正确的。所以 Front = [F1, F2] = [1, 2].

length构造[F1, F2]的方式类似:length(First, 2)断言length(FirstTail, 1),而这个断言length(FirstTailTail, 0),也就是break条件,所以FirstTailTail = [],这使得 First = [F1 | [F2 | []]] = [F1, F2].