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列在其中,param以便它在do/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

编辑:可以在 Krzysztof Apt 和 Mark Wallace 的“使用 ECLiPSe 进行约束逻辑编程”的第 7 章中找到对do/2ECLiPSe 中 -loops 的一个很好的介绍,包括相同的示例。transpose/2

于 2012-07-12T09:38:41.010 回答