使用PROLOG进行逻辑编程:规划示例


 

5.1 以下谜语是典型PRO-LOG程序的问题陈述。

一个农民想要把一棵卷心菜,一只山羊和一只狼带过一条河,但是他的船太小了,以至于他只能一次带过它们。农夫想了想,然后对自己说:如果我先把狼带到另一边,那么山羊会吃白菜。如果我先运送卷心菜,那么山羊会被狼吃掉。我该怎么办?

这是一项计划任务,我们可以通过一些思考快速解决。图 5.4中给出的PROLOG程序创建速度不是很快。

该程序的工作形式是状态(FarmerW​​olfGoatCabbage,描述了当前的世界状态。剩下可能值的四个变量,右边给出了对象的位置。中央复现谓词计划首先创建一个后继状态Next使用go,用安全性测试其安全性,并递归地重复这个,直到开始和目标状态相同(在程序行15中)。已经访问过的状态存储在计划的第三个参数中。使用内置的谓词成员,可以测试状态是否为Next已经被访问过了。如果是,则不会尝试。此处缺少输出计划的任务的谓词write_path的定义。它被建议作为读者的练习(第80 页的练习5.2)。对于最初的亲

1.  
约束逻辑编程77

图片

 

gram测试文字write_pathPath可以用writePath替换。对于查询开始。我们得到答案

 

解:

农民和山羊从左到右农民从右到左

农夫和狼从左到右农民和山羊从右到左农民和白菜从左到右农民从右到左

农民和山羊从左到右是的

为了更好地理解,我们在逻辑中描述了计划的定义:


ž计划(ZZ 小号
ž
ñ [ 去(SN安全(N计划(NZ
计划(SZ ]

这个定义比PROLOG更简洁。有两个原因。首先,发现的计划的输出对于逻辑来说是不重要的。此外,如果不必要的旅行不打扰农民,就没有必要检查是否已经访问了下一个州。但是,如果

+成员(被排除在PROLOG程序之外,然后有一个无限循环,PROLOG可能找不到计划,即使有一个。造成这种情况的原因是PROLOG的反向链接搜索策略,根据深度优先搜索(第6.2.2节)原则,它总是一次一个地处理子目标而不限制递归深度,因此是不完整的。对于具有完全微积分的定理证明器,这不会发生。

与所有计划任务一样,世界状态随着行动从一个步骤执行到下一个步骤而发生变化。这表明将状态作为变量发送到依赖于世界状态的所有谓词,例如谓词安全。状态转换发生在谓词go。这种方法称为情境演算
[RN10]
。我们将熟悉Chap中部分可观察,非确定性世界中学习动作序列的有趣扩展。10

 

图片


 


ETC注销ETC充值ETC客服ETC扣费查询


ETC发行合作

发表回复