Arrays 多维数组
我想在SICStus中创建一个多维数组,它的功能与ECLiPSe Dim函数几乎相同。为此,我编写了这段代码,但不幸的是,它总是进入一个无限循环。有人能解决这个问题吗Arrays 多维数组,arrays,prolog,sicstus-prolog,Arrays,Prolog,Sicstus Prolog,我想在SICStus中创建一个多维数组,它的功能与ECLiPSe Dim函数几乎相同。为此,我编写了这段代码,但不幸的是,它总是进入一个无限循环。有人能解决这个问题吗 %multDimensional Array 2d mult(X,Y,Final):- mult(X,Y,0,Final). mult(X,_,X,[]). mult(X,Y,Count,[A|B]) :- length(List,Y), A = List,
%multDimensional Array 2d
mult(X,Y,Final):- mult(X,Y,0,Final).
mult(X,_,X,[]).
mult(X,Y,Count,[A|B]) :- length(List,Y),
A = List,
Count1 is Count+1,
mult(X,Y,Count1,B).
%multDimensional Array 3d
mult2(Z,X,Y,Final):- mult2(X,Y,Z,0,Final),!.
mult2(_,_,Z,Z,[]).
mult2(X,Y,Z,Count,[A|B]):- multi(X,Y,0,Final),
Count1 is Count+1,
A = Final,
mult2(X,Y,Z,Count1,B).
multi(X,_,X,[]).
multi(X,Y,Count,[A|B]) :- length(List,Y),
A = List,
Count1 is Count+1,
multi(X,Y,Count1,B).
我想您必须阻止mult/4、mult/4和mult2/5的第二个子句成功,因为第一个子句已经成功了。请注意,mult/4和mult/4也是这样做的 例如,要修复mult/4,可以执行以下操作:
mult(X,_,X,[]).
mult(X,Y,Count,[A|B]) :-
X\=Count,
length(List,Y),
A = List,
Count1 is Count+1,
mult(X,Y,Count1,B).
同样的方法也可以用于修复其他过程我无法复制无限循环的问题,例如:
?- mult(3,4,F).
?- mult2(2,3,4,F).
然而,ECLiPSe的dim/3构建了一个术语表,而不是一个列表列表。这应该可以做到:
dim(Matrix, [Dim]) :-
!,
functor(Matrix, [], Dim).
dim(Matrix, [Dim|Rest]) :-
functor(Matrix, [], Dim),
Matrix =.. [_|Args],
dim0(Args, Rest).
dim0([], _) :- !.
dim0([Arg|Rest], Dims) :-
dim(Arg, Dims),
dim0(Rest, Dims).
?- dim(Matrix, [2, 2, 2]).
Matrix = []([]([](_655, _656), [](_659, _660)), []([](_674, _675), [](_678, _679)))
Yes (0.00s cpu)
SICStus的当前版本号是255,而ECLiPSe和SWI一样,YAP是无界的,B是65535。谢谢你指出这一点。这严重限制了SICStus中阵列的实用性。