毕业设计跟的导师是研究计算机理论的,花了三个月学习符号逻辑,试图优化一个回答集程序的求解器(Answer set solver)。比起眼花缭乱的前端框架和热闹的社区讨论,符号逻辑就是一个挺小众的数学领域。一讲到逻辑程序就会涉及一大堆的概念 ,伴随一大堆数理逻辑的符号,令有兴趣的新手望而却步。此篇博文可以说是导师的博士论文的一篇读后感,一篇回答集编程的发展史,一篇回答集程序入门简介。详见《提高ASP效率的若干途径及在服务机器人上的应用》。

1.人工智能学派

一些传统人工智能的研究者认为,(人工)智能可以通过符号推理形式化刻画,这一派系的研究现在被归类为符号主义。此外,还有联结主义和行为主义。当下很火的机器学习就是属于联结主义,原理主要为神经网络及神经网络间的连接机制与学习算法。行为主义源于控制论,主要的应用是感知-动作型控制系统。比起另外两个兄弟,符号逻辑目前的工业应用还很少,是一座数学家在构筑的伊甸园。

2.回答集程序的背景

“ASP研究来源于逻辑程序和非单调推理两个领域的交叉融合。最初,基于经典逻辑,逻辑程序定义了陈述性表达(declarative representation)的程序语言,并通过语法限制实现高效计算。之后,由于应用的需要引入否定知识的表达,并通过失败即否定原则进行推理。Gelfond and Lifschitz(1 988)提出稳定模型语义(stable model semantics),首次利用非单调推理领域的成果成功解释失败即否定。随着研究的深入,稳定模型语义不断被扩展,发现了很多良好的性质,它不光能解释逻辑程序中失败即否定,还与非单调推理中很多工作有密切联系,从而被认可为一个实用的非单调推理工具和可以表达常识知识的知识表示语言。之后,越来越多的人开始关注这个方向,并称这个新领域为回答集编程(Answer Set Programming,ASP)。“

2.1 逻辑程序

“逻辑程序起源于七十年代自动定理证明和人工智能方面的工作,其主要思想可以用Kowalski(1979)提出的等式来解释:Algorithm=Logic+Control。即,算法分为两部分,逻辑与控制。其中逻辑部分用来说明问题是什么(what),控制部分用来说明如何求解问题(how)。而逻辑程序的最终目标就是,程序员只需要刻画出算法的逻辑部分,系统可以自动求解。逻辑程序领域已经有诸如PROLOG的很多实际成果和应用。“

这种用通用方法求解问题的想法很美好,但实现起来非常艰难,推广也同样是一个大问题。这个工作可以类比C++中的模板(template),为一个复杂度高的抽象问题实现一个高效的程序,然后调用这个程序去解决简单的问题。目前,效率这一块已经有很高效的实现,反而应用方面,却不如预料中的广泛。成为流行的编程语言需要有很多条件,这个语言本来就不是面向一个广阔“市场”来设计的,自然难以做到流行。目前有中科大的服务机器人项目在应用这个语言,随着服务机器人的发展,逻辑程序的前景至少不算穷途末路。

2.2 逻辑程序中的否定

(传统)逻辑程序一般情况下只能推理出正文字形式的结论,但根据实际应用的需要,通过增加额外的规则,它也可以退出负文字形式的结论。这些额外规则中最主要的两个是:封闭世界假设(Closed World Assumption,CWA)和失败即台定(negation as failure,NAF)。

封闭世界假设来源于演绎数据库,由于数据库中有大量事实,为了更紧凑的表达,很自然的会假设,凡是没有说明为真的命题都默认为假。例如,当数据库中不存在某个时刻的航班时,我们会假设此刻没有此航班。严格的说,封闭世界假设对应推理规则:如果一个常原子A不是一个逻辑程序的结论(属于其极小模型),则推出A的否定。注意,封闭世界假设是一个非单调推理规则,即,当加入新知识后,原先推出的结论可能不再成立。同时,由于一阶逻辑是不可判定的,所以实际中封闭世界假设只能用在那些可以在有限时间内判断
出推不出的公式,由此引出失败即否定。失败即否定对应推理规则:如果常原子A被判断出推不出,则推出not A。同样,失败即否定也是一个非单调推理规则。

2.3 非单调推理
经典逻辑(命题,一阶)是单调的(monotonic):如果语句A是语句集丁的逻辑结论,则A一定是丁的任意超集的结论。即,增加新知识并不影响以前的结论。而常识推理却与此不同,大多数情况下,由于信息不完全,知识不完备等原因,为了推出有用的结果,我们不得不做一些额外的假设,例如封闭世界假设8。更一般的,我们假设环境是正常的(normal),没有意外发生,并得到通常情况下结论。而当环境变化,增加新知识后,原来的假设可能不再成立,即,发生意外,得知真实情况不再是通常的,此时我们只能调整以前的结论,甚至得到否定的结论。以下是一些常识推理的例子:

1.乌(通常情况下)会飞,特威蒂(tweety)是鸟,所以,特威蒂会飞。
2.鸟会飞,特威蒂是鸟,但特威蒂不会飞,所以,特威蒂不会飞。
3.鸟会飞,企鹅不会飞,特威蒂是鸟,特威蒂是企鹅,所以,特威蒂不知是否会飞。
4.企鹅是鸟,鸟会飞,企鹅不会飞,特威蒂是鸟,特威蒂是企鹅,所以,特威蒂不会飞。
5.贵格会教徒(通常情况下)是和平主义者,共和党人(通常情况下)不是和平主义者,尼克松是贵格会教徒,所以,尼克松是和平主义者。
6.贵格会教徒是和平主义者,共和党人不是和平主义者,尼克松是贵格会教徒,尼克松是共和党人,所以,尼克松不知是否是和平主义者。

这些推理是研究常识推理通常都会列举或考虑到的例子,其中第4项称为企鹅原则(Penguin Principle),第6项称为尼克松菱形(Nixon Diamond)。它们可以用来测试一个逻辑是否合理的刻画常识推理。而上述推理充分说明了非单调推理的作用,即,ASP的其中一个良好性质。

2.4 一个简单的ASP例子

紧接上一章:鸟(一般)会飞,但企鹅是一种不会飞的鸟。当我们知道名为tweety的个体的一些信息(它是小鸟,或进一步,它是企鹅)时,可以通过ASP推理它是否会飞:

此程序唯一的回答集为{penguin(tweety),bird(tweety),nfly(tweety)),即得出结论tweety不会飞。

如果从上面的程序中去掉事实penguin(tweety), 即只知道tweety是鸟,则新程序唯一的回答集为{bird(tweety),fly(tweety))。

即在只告诉tweety是鸟的情况,得出结论tweety会飞。该例子表明ASP可以合理刻画常识推理。

回答集编程背景(Answer Set Programming)的更多相关文章

  1. .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)

    本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...

  2. 编程范式 --- 面向协议编程(Protocol Oriented Programming,简称POP)

    面向协议编程(Protocol Oriented Programming,简称POP) 是Swift的一种编程范式,Apple于2015年WWDC踢出 在Swift的标准库中,能见到大量POP的影子 ...

  3. 管道式编程(Pipeline Style programming)

    受 F# 中的管道运算符和 C# 中的 LINQ 语法,管道式编程为 C# 提供了更加灵活性的功能性编程.通过使用 扩展函数 可以将多个功能连接起来构建成一个管道. 前言 在 C# 编程中,管道式编程 ...

  4. Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)

    JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...

  5. 一份传世典文:十年编程(Teach Yourself Programming in Ten Years)

    原文:Teach Yourself Programming in Ten Years作者:郭晓刚翻译:郭晓刚(foosleeper@163.net)最后修订日期:2004-3-192005-01-12 ...

  6. 海量并发的无锁编程 (lock free programming)

    最近在做在线架构的实现,在线架构和离线架构近线架构最大的区别是服务质量(SLA,Service Level Agreement,SLA 99.99代表10K的请求最多一次失败或者超时)和延时.而离线架 ...

  7. Java 面向切面编程(Aspect Oriented Programming,AOP)

    本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架--AspectWerkz 最近跳槽了,新公司使用了 AOP 相关的技术,于是查点资料,复习一下 ...

  8. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  9. 【转】Linux下的多线程编程背景知识

    1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...

随机推荐

  1. 当Node.js遇见Docker

    Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...

  2. 深入React组件生命周期

    上篇博文使用React开发的一些注意要点对React开发的一些重点进行了简单的罗列总结,虽然也提到了React生命周期,但只略微小结,在此单独写篇React生命周期的总结. 在组件的整个生命周期中,随 ...

  3. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

  4. 关于commonjs,AMD,CMD之间的异同

    1.简介 随着前端业务复杂度的增加,模块化成为一个大的趋势.而在ES6还未被浏览器所支持的情况下,commonjs作为ES6中标准模块加载方案,在客服端中的支持情况并不好,现在在客服端中有2中模块化的 ...

  5. VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

    一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...

  6. 手机自动化测试:appium源码分析之bootstrap六

    手机自动化测试:appium源码分析之bootstrap六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试 ...

  7. html实现 页面禁止右键 禁止复制 禁止图片拖动 禁止复制和剪切

    众所周知,一般的屏蔽的方法是用JS来编写的脚本,但是也可以直接通过修改网页属性的方法来屏蔽右键 禁止复制. 禁止右键 oncontextmenu="return false" 禁止 ...

  8. mysql 主从同步 实现增量备份

    数据库复制 replication 的实现原理 1:主服务器凡运行语句,都产生一个二进制日志 binlog 2:从服务器不断读取主服务器的binlog 3:从主服务读取到的binlog,转换为自身可执 ...

  9. Java线程池使用和分析(二) - execute()原理

    相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...

  10. SVG格式转Visio的vsd格式方法,附带C#动态调用Office的Com组件方法

    SVG格式可以直接显示在网页上面,用来实现诸如统计Chart图表.流程图.组织结构图的功能.为了使图像可以下载下来以便于修改,可以将SVG转为Visio的vsd格式.方法很简单,主要是使用Visio组 ...