24智能编程语言Prolog.ppt
文本预览下载声明
power(_,0,1):-!. power(X,Y,Z):-L is Y-1, power(X,L,M), Z is M*X. 是否前面讲过的计算阶乘的例子也存在类似的问题? ?-power(2,3,Z). Z=8?; no 如果我们对其提问: 以上情况显然是我们不希望的,这可以通过在停止条件中设置截断而得以避免: [例]power(X,Y,Z)是用来计算X的Y次幂的谓词,即XY=Z 7.4 Prolog入门---截断 在寻找Nani的游戏中,我们可以设置一个谜题puzzle,即玩家要到地下室(cellar)中去,首先必须拥有手电筒,并且打开了,才能够进到地下室中。如果这些条件都满足了,就不需要Prolog再去进行其它的搜索。这里我们可以使用截断。 7.4 Prolog入门---截断 puzzle(goto(cellar)):-have(flashlight),turned_on(flashlight), !. 【角色扮演游戏-小女孩找毛毯】 时间安排:待定。 地点:待定。 实验目的: 熟悉了解swi-Prolog的集成编程环境。 通过改错,或打开Prolog.err学习语法。 学会阅读程序,通过单步跟踪,验证理解程序。 简单的编程和调试。 实验内容和步骤: 编辑自编的梵塔程序(起名HANO.pro),单步跟踪调试它。 记下最后显示结果与实验心得/建议,于下周交给班长。 阅读Hanoi梵塔程序说明后,运行Hanoi.pro 阅读Pair婚介配对程序说明后,运行Pair.pro 实验/作业 * * * * * * 递归:利用事物自身定义事物的过程。在Prolog中,当某个谓词的目标中包含了此谓词本身时,Prolog将进行递归调用。 7.7 Prolog入门---递归和表 递归包含两个部分: 边界条件 递归部分 边界条件定义最简单的情况。而递归部分,则首先解决一部分问题,然后再调用其自身来解决剩下的部分,每一次都将进行边界检测,如果剩下的部分已经是边界条件中所定义的情况时,那么递归就圆满成功了。 可以看出,n的阶乘可以通过n乘n-1的阶乘来计算,n-1的阶乘又可以通过n-2的阶乘来计算,直到边界条件(1的阶乘)出现。 【Prolog实现阶乘运算】 阶乘定义:该数与小于它的全部正整数的积。如: 5!=5*4*3*2*1=120 n!=n*(n-1)*(n-2)*……*2*1 不过,阶乘还可以表示为: 5!=5*4! n!=(n-1)! 7.7 Prolog入门---递归和表 我们用谓词factorial(Number,Fact)来描述阶乘,即如果正整数Number的阶乘为Fact,则该谓词成功。则阶乘可以定义为: factorial(1,1). factorial(Number,Fact):-Numb1 is Number-1, factorial(Numb1,Fact1), Fact is Number*Fact1. 边界条件: 递归部分: 【Prolog实现阶乘运算】 7.7 Prolog入门---递归和表 对上述程序,如询问: 【Prolog实现阶乘运算】 ?-factorial(4,X). Prolog进入数据库,搜索初始目标factorial(4,X)的匹配。首先,Prolog跨过不能与初始目标匹配的边界条件,进入递归规则后,搜索规则头,将变量Number例示为4,未例示变量Fact与变量X共享。 Numb1 is 4-1,factorial(Numb1,Fact1),Fact is 4*Fact1. Prolog再次进入数据库,试图满足目标factorial(3,Fact1).如此,直到找到和边界条件factorial(1,1)匹配的目标。然后逐步返回,并给出答案: X=24? 7.7 Prolog入门---递归和表 递归定义的规则会连续反复地产生递归规则,直至遇到边界条件为止,再按原步骤返回,为用户提供最后结果。 使用递归的注意事项 注意:在知识库中,边界条件必须放在递归规则前面。否则边界条件永远得不到满足,将引起无穷递归,导致程序异常中断。 7.7 Prolog入门---递归和表 以前所定义的location谓词,表述了手电筒(flashlight)在桌子(desk)里,而桌子在办公室(office)中。但是那时Prolog并不能判断手电筒是否在办公室中。 location(envelope, desk). location(stamp, envelope). location(key, envelope). 如果使用递归,可以很轻松地写出谓词is_contained_in,它能够跟踪物体的所在的位置,因此它能判断手电筒是否在办公室中。为了让问题更加有趣一些,我们再加入一些物
显示全部