1

「Learn Prolog」という本でPrologを学んでいます。私はPrologの初心者です。

私はナレッジベースを持っています:

 transpose(Matrix, Transpose) :-
          dim(Matrix, [R, C]),
          dim(Transpose, [C, R]),
          ( foreachelem(E,Matrix,[I,J]),
             param(Transpose)
            do subscript(Transpose,[J, I], E ) ).

走る:

Matrix=[]([](11,12),[](21,22),[](31,32)),transpose(Matrix,Transpose).

結果:

Matrix = []([](11, 12), [](21, 22), [](31, 32))
Transpose = []([](11, 21, 31), [](12, 22, 32))

の趣旨がわかりませんparam。理解するのを手伝ってください。ありがとう。

4

1 に答える 1

1

変数は、ループ内で使用できるようにTransposeリストされます。paramdo/2

呼び出しdo/2をマクロと見なします。ECLiPSe コンパイラーは、それらを補助述部に変換します。

したがって、述語transpose/2は次のようになります。

transpose(Matrix, Transpose) :-
      dim(Matrix, [R, C]),
      dim(Transpose, [C, R]),
      do__1(..., Transpose).

do__1(..., Transpose) :- !.
do__1(..., Transpose) :- 
    ForelemGoals, 
    subscript(Transpose,[J, I], E ), 
    do__1(..., Transpose).

do__1述語が for ループのように正確にどのように見えるforeachelemかはわかりません。paramただし、いずれにせよ、エントリ内のすべての変数がdo__1ヘッド内の変数に追加されるため、補助述語内で使用できます。これがないと、述語のループTranspose内の変数はループ外の変数に接続されません。do/2transpose/2Transpose

編集do/2まったく同じ例を含むECLiPSeのループの良い紹介transpose/2は、Krzysztof AptとMark Wallaceによる「ECLiPSeを使用した制約論理プログラミング」の第7章にあります。

于 2012-07-12T09:38:41.010 に答える