4.4.3 逻辑编程是数学的逻辑吗

4.4.3 逻辑编程是数学的逻辑吗
在查询语言中被使用的组合的方法首先可能与数学逻辑的与或非操作相同,查询语言的规则的应用
在事实上是由推理的方法来完成的。查询语言与数学逻辑的标识性并不是真正的有效的,因为查询
语言提供了一个控制结构来程序化的解释逻辑语句。我们能够常常利用这种控制结构。例如,为了
找到所有的程序员的监督者,我们能写一个查询,以如下的两种等价的形式:

(and  (job  ?x   (computer programmer))
      (supervisor   ?x   ?y))

或者是

(and (supervisor   ?x   ?y)
        (job  ?x   (computer programmer)))

如果一个公司有比程序员更多的监督者,(普通的例子)那么使用上面的第一个写法比第二个的写法更好。
因为数据库能被扫描生成的结果是由第一个子句生成的。

逻辑语言的作用是提供给程序员把一个计算的问题分解成两个独立的问题的技术。
这两个问题是什么能被计算,这应该如何计算?通过选择数学逻辑的语句的子集,
就能完成这个任务了。数学逻辑有足够的能力来描述什么可能被计算,然而却没有
足够的能力有一个可控制性的程序化的解释。这里的目的是说,一方面,在一种逻辑
编程的语言中规范的程序应该是一个易被影响的能被一个计算机执行的程序。根据语言
的解释的顺序,控制(即如何计算)能被影响。我们应该能够安排子句的顺序,子目标的顺序,
为了计算被完成在一种顺序中,并且是有影响的且有效率的。同时,我们应该能够把
计算的结果(计算什么)可视化,作为逻辑的规则的一简单的成果。

我们的查询语言能够被认为是数学逻辑的一个程序化的可解释的子集。一个断言表示一个简单的事实。
一个规则 表示了内容是规则结论要满足的规则内容体的条件。一个规则有一个自然的程序化的解释。
为了建立规则的结论内部,建立规则的内容体。规则因此指定了计算。然而,因为规则也能被认为是
数学逻辑的语言,我们能通过一个逻辑程序来完成任何的推理。逻辑程序通过使用数学逻辑
得到断言的相同的结果。

* 无限的循环
逻辑程序的程序化解释的一个结果是为了解释特定的问题,组装了一个无希望的低效率的程序
的情况可能会发生。在做推导时当系统陷入了无限的循环时,低效率的极端的例子就发生了。
作一个简单的例子,假定我们为了著名的婚姻安装了一个数据库,包括

(assert!   (married Minnie  Mickey))

如果我们现在问

(married  Mickey  ?who)

我们将没有得到响应,因为系统不知道,如果A和B是夫妻,那么B和A是夫妻。
所以我们加上了如下的规则

(assert!   (rule   (married  ?x  ?y)  (married ?y ?x)))

并且再一次查询

(married  Mickey  ?who)

不幸的是,这将驱动系统进入了无限的循环,如下:

.系统发现married规则是可应用的,也就是规则的结论 (married ?x ?y)成功地统一了查询模式
(married  Mickey  ?who),生成了一个帧,它的?x 绑定了 Mickey 和 ?y 绑定了 ?who。所以
解释器继续解释规则的内容体(married ?y  ?x),在效果上看,是处理查询(married ?who  Mickey)
.  在数据库中一个答案直接作为记录出现了:(married  Minnie  Mickey)
.  married规则是可应用的,所以解释器再一次解释规则的内容体,这一次等价为(married  Mickey  ?who)

系统现在处于无限循环之中。的确,在系统进行无限循环之前,系统是否将发现简单的答案
(married  Minnie  Mickey),依赖于系统检查数据库中项的顺序这样的实现细节。互关联的规则的集合能够
导致更难参与的循环,循环的情况依赖于在一个与操作中的子句的顺序(见练习4.64)或者是系统处理查询的
顺序的低层次的细节。

* not 带来的问题
在查询系统中的另一个问题涉及到not.给定一个4.4.1部分中的数据库,考虑如下的两个查询:

(and  (supervisor   ?x  ?y) 
         (not  (job ?x   (computer programmer))))

(and  (not  (job ?x   (computer programmer)))
         (supervisor   ?x  ?y))

这两个查询没有生成相同的结果。第一个查询开始于在数据库中
找到所有的匹配(supervisor   ?x  ?y)的记录。并且然后过滤结果帧,并且移除
满足(job ?x   (computer programmer))的条件。第二个查询开始于过滤
满足(job ?x   (computer programmer)),因为帧是空的,它检查数据库是否有模式满足
(job ?x   (computer programmer)),因为这是入口,非子句过滤了空的帧,返回了一个空的流。
因此,整个流返回空。

困难在于非的实现真的是在变量的值的过滤器。如果一个非的子句被处理,一个帧中的
一些变量保留着未绑定。系统生成了非期望的结果。相似的问题发生在lisp-value的使用,
如果它的实际参数未绑定,Lisp的断言不能工作。见练习4.77

查询语言的非不同于数学逻辑的非,这也有更多的严肃的方式。在逻辑上,我们解释了
语句 “not P”意味着P不是真的。在查询系统中,然而,“not p”意味着P不在数据库中知识。
例如,给出一个个人员工的数据库, 系统推导着非语句的排序,例如 苯不是一个排球迷,
户外没有雨,2+2不等于4。换句话说,逻辑编程语言的非反映因此叫,所有的相关的信息
已经包括在数据库中。

练习4.64
罗斯从数据库中误删除了规则 Outranked-by(4.4.1部分)。当他意识到这时,他快速
重新安装了它。不幸的是,他在规则中做了一点修改,并且内容如下:

(rule  (outranked-by  ?staff-person   ?boss) 
         (or  (supervisor   ?staff-person  ?boss) 
                (and  (outranked-by   ?middle-manager  ?boss)
                         (supervisor   ?staff-person  ?middle-manager))))

罗斯向系统中输入了这个信息后,威特发现谁比苯位高,他发出了查询

(outranked-by  (Bitdiddle Ben)  ?who)

回答了之后,系统进入了无限的循环。解释为什么。

练习4.65
Cy,当他在公司时,他期待着有一天,给一个查询,找到的所有的间接的领导。
(使用4.4.1部分中的规则 wheel)

(wheel   ?who)

令他吃惊的是,系统返回:
;;;Query results:
(wheel  (Warbucks Oliver))
(wheel  (Bitdiddle Ben))
(wheel  (Warbucks Oliver))
(wheel  (Warbucks Oliver))
(wheel  (Warbucks Oliver))

为什么 Warbucks 被列出了四次?

练习4.66
苯已经泛化了查询系统,为了提供关于公司的统计信息。
例如,为了找到所有的程序员的总工资数,查询如下:

(sum  ?amount 
            (and  (job  ?x  (computer programmer))
                     (salary  ?x  ?amount)))

总之,苯的新的系统允许如下的表达式的形式:

(accumulation-function  <variable>  <query pattern>)

accumulation-function能像sum,average,maximum一样。
苯的理由是实现这应该是很容易的事。他将简单地把查询模式喂给qeval.
这产生了一个帧的流。他然后把这个流给了一个映射函数,把流中的每个帧中
抽取了特定的变量的值,再把值的结果流喂给了accumulation函数。正如苯完成的实现,
并且将测试。Cy用练习4.65的wheel查询结果来解谜。当Cy显出了苯的系统的响应,
苯说“不,我们简单的累计的函数失效了。”

苯已经意识到了什么?为了解决这种情况,列出他能使用的方法

练习4.67
在查询系统中,为了安装一个循环检测器,用它来避免在练习4.64中出现的简单的循环情况,
给出一个方式。通用的思想是系统应该维护推导的当前链条的一些历史信息,当它正在工作时,
不应该开始处理一个新的查询。描述一下什么样的信息(模式和帧)应该包括在这个历史中,
应该如何做检查。(当你学习了在4.4.4部分中的查询系统的实现细节后,你可能要修改系统来
包括你的循环检测器)

练习4.68
定义一个规则来实现练习2.18中的反向操作,它返回一个列表,包括与给定的列有一样的元素,
且与原列表的排列顺序相反。(提示:使用append-to-form)你的规则能回答(reverse (1 2 3)  ?x)
和 (reverse   ?x  (1 2 3)) 吗?

练习4.69
开始于你在练习4.63中写的数据库内容与规则,写一个规则 添加"太"到祖孙关系中。
这应该能让系统推导出irad是Adam的重孙,或者Jabal和Jubal是Adam的重重重重重孙。
(提示:表示关于Irad的事实,例如 ((great  grandson)   Adam Irad)) .写规则确定
一个列表的结尾处是否是孙子。使用这个来表达一个规则 允许人来推导关系 
((great  .  ?rel)   ?x  ?y),   ?rel 是一个列表以孙子结尾 ) .  以查询检查 你的规则,例如
((great  grandson)   ?g  ?ggs) 和 (?relationship  Adam Irad)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值