从 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).
有效?
因为 length
和 append
都做了与上面非常相似的事情。 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 = 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)
,也就是break条件,所以FirstTailTail = []
,这使得 First = [F1 | [F2 | []]] = [F1, F2]
.
我是 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).
有效?
因为 length
和 append
都做了与上面非常相似的事情。 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 = 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)
,也就是break条件,所以FirstTailTail = []
,这使得 First = [F1 | [F2 | []]] = [F1, F2]
.