首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >do-loop中param的用途

do-loop中param的用途
EN

Stack Overflow用户
提问于 2012-07-12 13:12:42
回答 1查看 361关注 0票数 1

我正在从“学习Prolog”一书中学习Prolog。我在Prolog方面是个新手。

我有知识库:

代码语言:javascript
复制
 transpose(Matrix, Transpose) :-
          dim(Matrix, [R, C]),
          dim(Transpose, [C, R]),
          ( foreachelem(E,Matrix,[I,J]),
             param(Transpose)
            do subscript(Transpose,[J, I], E ) ).

运行:

代码语言:javascript
复制
Matrix=[]([](11,12),[](21,22),[](31,32)),transpose(Matrix,Transpose).

结果:

代码语言:javascript
复制
Matrix = []([](11, 12), [](21, 22), [](31, 32))
Transpose = []([](11, 21, 31), [](12, 22, 32))

我不明白param的目的。帮我理解一下。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2012-07-12 17:38:41

变量Transposeparam中列出,以便在do/2循环中可用。

do/2调用视为宏。ECLiPSe编译器将它们转换为辅助谓词。

因此,您的谓词transpose/2如下所示:

代码语言:javascript
复制
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).

我不知道foreachelem循环的do__1谓词到底是什么样子。但在任何情况下,param条目中的所有变量都被添加到do__1头中的变量中,以便它们在辅助谓词中可用。否则,transpose/2谓词的do/2循环内的Transpose变量将无法连接到循环外的Transpose变量。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11445340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档