Prolog,函数自己运行,但是当被另一个函数调用时,它表示参数没有充分实例化

时间:2013-04-04 11:42:20

标签: prolog

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

1 个答案:

答案 0 :(得分:1)

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

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

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

我希望你能阅读我不必要的长期不答案,你就可以使用它了。