do循环中param的目的

时间:2012-07-12 05:12:42

标签: prolog

我正在从“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的目的。 帮帮我理解感谢。

1 个答案:

答案 0 :(得分: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谓词如何与foreachelem循环完全相同,我不知道。但无论如何,param条目中的所有变量都添加到do__1头中的变量中,以便它们在辅助谓词中可用。如果不这样,Transpose谓词的do/2循环内的transpose/2变量将与循环外的Transpose变量没有任何关联。

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