我试过这样的事情: 所述路径= [[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。
答案 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
。然后,该递归调用的最后一个参数是无处不在的,所以你可能也需要注意它。作为最后一个建议,尝试将谓词拆分为两个子句:第一个用于管理N
为0
的基本基本案例,第二个用于管理多余案例,构建在另一个之上。
哦,由于N
是一个可变数量,我建议使用不同的名称,而不是误导first_three
作为谓词。