0

ECLiPSe Dim 関数とほぼ同じことを行う多次元配列を SICStus で作成したいと考えています。そのためにこのコードを作ったのですが、残念ながらいつも無限ループに陥ってしまいます。誰でも問題を解決できますか?

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

2 に答える 2

0

最初の句がすでに成功している場合、mult/4、multi/4、および mult2/5 の 2 番目の句が成功するのを防ぐ必要があると思います (また、mult/4 と multi/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).

同じアプローチを使用して、他の手順を修正できます

于 2011-12-06T13:10:53.960 に答える
0

次のようなクエリの無限ループで問題を再現できません。

?- mult(3,4,F).
?- mult2(2,3,4,F).

しかし、ECLiPSedim/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)
于 2011-12-06T13:11:31.177 に答える