Prolog如何将列表中的前3个元素存储到另一个列表中

时间:2011-10-12 14:38:30

标签: prolog

我试过这样的事情: 所述路径= [[1,2],[2,3],[3,4],[5,6]]

first_three(N,[H|T],[H|_]):- not(N=0),N is N-1, first_three(N,T,L). 

然后我调用first_three(3,path,Y)但它返回no。

2 个答案:

答案 0 :(得分:1)

您需要添加基本案例(当N = 0时)。而且你还需要实例化一个新的新变量来赋值N的前置,最后你还需要返回递归的结果(clasuse头部的[H | L]):

first_three(0,_,[).
first_three(N,[H|T],[H|L]):- 
  N\=0,
  N1 is N-1, 
  first_three(N,T,L).

当然,您也可以写下这样的内容:

first_three([One,Two, Three|_], [One,Two, Three]).

并称之为:

first_three(Path, Y).

答案 1 :(得分:1)

首先,N is N - 1不可能成功 - N不是命令式编程语言意义上的变量,因此您不会在其中存储值,只能分配一次,可以这么说 - 所以你可能想要引入一个新变量并调用N1 is N - 1之类的东西,然后在N1的递归调用中使用first_three。然后,该递归调用的最后一个参数是无处不在的,所以你可能也需要注意它。作为最后一个建议,尝试将谓词拆分为两个子句:第一个用于管理N0的基本基本案例,第二个用于管理多余案例,构建在另一个之上。

哦,由于N是一个可变数量,我建议使用不同的名称,而不是误导first_three作为谓词。