Prolog,函数本身运行,但当被另一个函数调用时,它表示参数没有充分实例化
我使用下面的代码按最后一个元素快速排序四倍。当我单独调用productSort时,它会按预期对列表进行排序。但是,当我在使用makeList函数后运行它时,它不工作,并且在我单独使用它时返回运行。但是,当我尝试使用它时,它会说“ERROR:>=/2:参数没有充分实例化 例外情况:(2359)splitListProduct(_G35274,[2,3,5,6],_G90741,_G90651)?”Prolog,函数本身运行,但当被另一个函数调用时,它表示参数没有充分实例化,prolog,Prolog,我使用下面的代码按最后一个元素快速排序四倍。当我单独调用productSort时,它会按预期对列表进行排序。但是,当我在使用makeList函数后运行它时,它不工作,并且在我单独使用它时返回运行。但是,当我尝试使用它时,它会说“ERROR:>=/2:参数没有充分实例化 例外情况:(2359)splitListProduct(_G35274,[2,3,5,6],_G90741,_G90651)?” makeList(\N,50,\P,[]):-!。 生成列表(N,X,Y,[[X,Y,和,积]| L
makeList(\N,50,\P,[]):-!。
生成列表(N,X,Y,[[X,Y,和,积]| L2]):-
总和是X+Y,
总和=N,
NewX是X+1,
NewY是X+2,
生成列表(N,NewX,NewY,L)。
适当长度(列表,长度):-
is_列表(列表),
长度(列表,长度)。
运行(N,X,Y,L):-makeList(N,X,Y,L),productSort(L,SortedL)。
productSort([[X,Y,S,P | | | Xs],Ys]:-
splitListProduct(Xs[X,Y,S,P],Left,Right),/*拆分它,我们在这里有一个嵌套的列表作为X*/
productSort(左,左),
productSort(右,右),
附加(Ls,[[X,Y,S,P]| Rs],Ys),!。
productSort([],[])。
splitListProduct([[X2,Y2,S2,P2]| Xs],[X1,Y1,S1,P1 | | u],[X2,Y2,S2,P2]| Ls],Rs):-/*Y是嵌套列表*/
P1>=P2,splitListProduct(Xs,[X1,Y1,S1,P1],Ls,Rs)。
拆分列表产品([[X2,Y2,S2,P2]| Xs],[X1,Y1,S1,P1 | |,Ls,[[X2,Y2,S2,P2]| Rs]):-
P2>P1,splitListProduct(Xs,[X1,Y1,S1,P1],Ls,Rs)。
拆分列表产品([],Y,[],[]):-!。
追加([],Ys,Ys)。
附加([X|Xs],Ys[X|Zs]):-append(Xs,Ys,Zs)。
首先,这是一个非常大的程序,您已经粘贴到其中。如果您首先尝试找到一个具有您所遇到问题的最小示例,这将非常有用。这将使我们更容易发现问题,您也可以在过程中自己发现问题。用我们这个时代的说法,它被称为“调试”
然后,我尝试编译您的代码,它会给出多个单例变量警告。这并不一定意味着程序逻辑中有错误,但它表明存在问题、疏忽或代码不符合Prolog编程约定
第三,您的错误消息非常清楚:您正在使用算术比较运算符,比较未实例化的变量。Prolog算术比较运算符仅为算术表达式定义,不为未绑定变量定义。这就是你的问题所在。在你的程序中只有一行有这个操作符,所以你甚至知道从哪里开始寻找。我还可以猜测,您的makeList
最终创建了一个包含未绑定变量的列表
我希望你能阅读我不必要的长篇大论,你能利用它
makeList(_N, 50, _P, []):-!.
makeList(N, X, Y, [[X, Y, Sum, Product] | L2]) :-
Sum is X + Y,
Sum =< N,
Product is X * Y,
Hello is Y+1,
write([X, Y, Sum, Product]),nl,
makeList(N, X, Hello, L2).
makeList(N, X, Y, L) :-
write('here'),nl,
write(X),nl,
X == 49, !.
makeList(N, X, Y, L) :-
write('Y'), write(Y),nl,
write('X'), write(X),nl,
Sum is X + Y,
Sum > N,
NewX is X + 1,
NewY is X + 2,
makeList(N, NewX, NewY , L).
proper_length(List, Length) :-
is_list(List),
length(List, Length).
run(N, X, Y, L) :- makeList(N, X, Y, L), productSort(L,SortedL).
productSort([[X,Y,S,P|_]|Xs],Ys) :-
splitListProduct(Xs,[X,Y,S,P],Left,Right), /*Split it, we have a nested list here as X*/
productSort(Left,Ls),
productSort(Right,Rs),
append(Ls,[[X,Y,S,P]|Rs],Ys),!.
productSort([],[]).
splitListProduct([[X2,Y2,S2,P2]|Xs],[X1,Y1,S1,P1|_],[[X2,Y2,S2,P2]|Ls],Rs) :- /* Y is the nested list*/
P1 >= P2, splitListProduct(Xs,[X1,Y1,S1,P1],Ls,Rs).
splitListProduct([[X2,Y2,S2,P2]|Xs],[X1,Y1,S1,P1|_],Ls,[[X2,Y2,S2,P2]|Rs]) :-
P2 > P1, splitListProduct(Xs,[X1,Y1,S1,P1],Ls,Rs).
splitListProduct([],Y,[],[]):-!.
append([],Ys,Ys).
append([X|Xs],Ys,[X|Zs]) :- append(Xs,Ys,Zs).