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