http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlch3
本章有两个主要目标:
1. 在Prolog中引入递归定义。
2. 为了表明Prolog程序的声明性含义与其过程性含义之间可能存在不匹配。
3.1 递归定义
谓词可以递归定义。 粗略地说,如果谓词中的一个或多个规则引用了自己,则它是递归定义的。
现在,让我们考虑一下此定义的声明性和程序性含义。
“声明性”一词用于谈论Prolog知识库的逻辑含义。 也就是说,Prolog知识库的声明性含义只是“它说了什么”,或者“如果我们将其作为逻辑语句的集合来阅读,则意味着什么”。 而且此递归定义的声明性含义非常简单。 第一个子句(转义子句,即非递归子句,或者通常称为基子句)只是说:如果X刚吃掉Y,那么X现在正在消化Y。 这显然是一个明智的定义。
那么第二个子句,即递归子句呢? 这就是说:如果X刚吃掉Z并且Z在消化Y,那么X也在消化Y。 同样,这显然是一个明智的定义。