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

时间:2015-10-21 02:06:11

标签: prolog

我是Prolog的初学者,我正在尝试编写从列表前面取n个元素时保持为真的谓词。这就是我所写的,它似乎不起作用:
>>> parsed_data = json.loads('{"title": "HALO CAF\u00c9 MOCHA"}') >>> with open('foo.txt', 'w') as fin: ... fin.write(parsed_data['title'].encode('utf-8')) ... 我假设for(N,List,Front)保持为true,List和Front必须是相同的列表,这意味着take(N, List, Front):- length(Front, N), append(Front, [], List).必须为true,而Front必须为N,因此append(Front, [], List)必须坚持。


现在当我在翻译中尝试这个时,我得到以下内容:
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).

1 个答案:

答案 0 :(得分:2)

如果您想从N的前面截取List元素,就像从N - 1的尾部前面取List个元素一样,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:< / p>

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),这是中断条件,因此{{ 1}},这使FirstTailTail = []