Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog,函数本身运行,但当被另一个函数调用时,它表示参数没有充分实例化_Prolog - Fatal编程技术网

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

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

我使用下面的代码按最后一个元素快速排序四倍。当我单独调用productSort时,它会按预期对列表进行排序。但是,当我在使用makeList函数后运行它时,它不工作,并且在我单独使用它时返回运行。但是,当我尝试使用它时,它会说“ERROR:>=/2:参数没有充分实例化 例外情况:(2359)splitListProduct(_G35274,[2,3,5,6],_G90741,_G90651)?”

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).