2015-10-21 131 views
2

我是Prolog的初学者,我试着写出从列表前面取n个元素时谓词成立的谓词。这是我写的,它似乎并没有工作:
take(N, List, Front):- length(Front, N), append(Front, [], List). 我认为对于拿(N,列表,前)保持真实,列表和前台必须是相同的列表,这意味着append(Front, [], List)必须成立, Front必须大小为N,因此length(Front, N)必须成立。从Prolog的列表前面取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.

回答

2

如果你想利用N元素从List前,这就像从List的尾部前端取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),这是休息状态,所以FirstTailTail = [],这使得First = [F1 | [F2 | []]] = [F1, F2]

+0

谢谢,肯定会工作,但由于某种原因,如果我改变采取(N,列表,前): - 长度(前,N),追加(前,[],列表)。 (N,List,Front): - 长度(Front,N),追加(Front,_,List)。它工作正常。有人可以解释为什么。 – killuminati

+0

我的意思是这个:取(N,List,Front): - 长度(Front,N),追加(Front,_,List)。 – killuminati

+0

感谢您的解释,它使得它更清晰。 – killuminati