我是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).
答案 0 :(得分:2)
如果您想从N
的前面截取List
元素,就像从N - 1
的尾部前面取List
个元素一样,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
:< / p>
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)
,这是中断条件,因此{{ 1}},这使FirstTailTail = []
。