0

我正在使用以下代码按最后一个元素快速排序四倍。当我自己调用 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).   
4

1 回答 1

1

首先,这是您粘贴的一个非常大的程序。如果您首先尝试找到一个遇到您遇到的问题的最小示例,这将非常有用。这将使我们更容易发现问题,您可能会在此过程中自己发现问题。用我们这个时代的说法,它被称为“调试”。

然后,我尝试编译你的代码,它给出了多个单例变量警告。这并不一定意味着程序的逻辑有错误,但它表明存在问题、疏忽,或者只是代码不符合 Prolog 编程约定。

第三,您的错误信息非常清楚:您正在使用算术比较运算符,比较未实例化的变量。Prolog 算术比较运算符仅用于算术表达式,而不用于未绑定变量。所以你的问题就在那里。而且你的程序中只有一行有这个操作符,所以你甚至知道从哪里开始寻找。而且我还可以猜测您makeList最终会创建一个包含未绑定变量的列表。

我希望您会阅读我不必要的冗长非答案,并且您将能够使用它。

于 2013-04-04T12:51:49.180 回答