在学习Prolog的递归、列表之前,我们得先了解一下它的运行原理和调试。调试是排除程序中错误的过程,它是一种非常复杂的过程,特别是当开发的程序很长很复杂的时候更是如此,在这种情况下,明智的作法是把一个大程序分成许多较小的程序分别进行测试和调试。Prolog为用户提供了一系列的调试谓词,它们允许程序在执行的同时追踪Prolog的搜索过程。

2、盒子模型把一个谓词想象为一个盒子,Prolog解释程序的控制流通过这个盒子。如图所示,盒子的四个角上稳中有降有四个进、出端口,这些端口的含义分别是:CALL:Prolog为满足某个目标进入盒子时扬经过的端口;EXIT:Prolog在目标得到满足(即匹配成功)后离开盒子时所经过的端口;FAIL:Prolog在目标未能满足(即匹配失败)时退出盒子所经过的端口;REDO:Prolog为了再次满足某个目标进行回溯时,重新进入盒子的端口。

4、如果我们提出询问-? fish(X).程序执行所经过的路线如图所示。从图中可以看到,所要萍踪的总体目标fish(X)用最大的,即最外面的盒子A表示,子目标covered(X, scales)和invertebrate(X)分别用里面的两个盒子表示(盒子B和盒子C)。

调试谓词
1、载入程序文件后,为了实现调试功能,应当在运行程序前,在提示符“?-”后键入命令:trace.在某些版本的Prolog中,调试采用spy命令。调试程序对每个调用都在括号中给出一个数字。该数字表示调用的“深度”,即初始目标调用期间所做的目标调用次数。还需注意的是,变量用下划线和紧接其后的数字表示。在调试方面,感觉SWI-Prolog隐藏了一些东西,不如GNU Prolog直观。图中“?”后的信息为用户键入的,其他为显示信息,在得出第一个答案后,要按“;”搜索另一个答案,其他按回车或“c”就可以继续。
