我正在从“学习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的目的。帮我理解一下。谢谢。
发布于 2012-07-12 17:38:41
变量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).我不知道foreachelem循环的do__1谓词到底是什么样子。但在任何情况下,param条目中的所有变量都被添加到do__1头中的变量中,以便它们在辅助谓词中可用。否则,transpose/2谓词的do/2循环内的Transpose变量将无法连接到循环外的Transpose变量。
编辑:在Krzysztof Apt和Mark Wallace的“使用transpose/2进行约束逻辑编程”的第7章中,可以找到对-loops in ECLiPSe的很好的介绍,包括非常相同的transpose/2示例。
https://stackoverflow.com/questions/11445340
复制相似问题