我使用以下代码通过最后一个元素快速排序四元组。当我自己调用productSort时,它按预期对列表进行排序。但是当我在使用makeList函数后运行它时,它不起作用,并在我自己使用它时返回运行。但是,当我尝试使用它时,它显示“错误:> = / 2:参数未充分实例化 例外:(2,359)splitListProduct(_G35274,[2,3,5,6],_G90741,_G90651)?“。
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).
答案 0 :(得分:1)
首先,这是你在那里粘贴的一个非常大的程序。如果您首先尝试找到遇到问题的最小示例,那将非常有用。这将使我们更容易发现问题,您可以在此过程中自己发现它。按照我们这个时代的说法,它被称为“调试”。
然后,我尝试编译你的代码,它给出了多个单例变量警告。它并不一定意味着您在程序的逻辑中有错误,但它表示存在问题,疏忽,或者只是不符合Prolog编程约定的代码。
第三,您的错误消息非常清楚:您正在使用算术比较运算符,比较未实例化的变量。 Prolog算术比较运算符仅为算术表达式定义,而不是为未绑定变量定义。所以那里有你的问题。并且程序中只有一行具有此运算符,因此您甚至可以知道从哪里开始查找。我还猜测你的makeList
最终会创建一个包含未绑定变量的列表。
我希望你能阅读我不必要的长期不答案,你就可以使用它了。