回答集编程背景(Answer Set Programming)
毕业设计跟的导师是研究计算机理论的,花了三个月学习符号逻辑,试图优化一个回答集程序的求解器(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)的更多相关文章
- .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)
本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...
- 编程范式 --- 面向协议编程(Protocol Oriented Programming,简称POP)
面向协议编程(Protocol Oriented Programming,简称POP) 是Swift的一种编程范式,Apple于2015年WWDC踢出 在Swift的标准库中,能见到大量POP的影子 ...
- 管道式编程(Pipeline Style programming)
受 F# 中的管道运算符和 C# 中的 LINQ 语法,管道式编程为 C# 提供了更加灵活性的功能性编程.通过使用 扩展函数 可以将多个功能连接起来构建成一个管道. 前言 在 C# 编程中,管道式编程 ...
- Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)
JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...
- 一份传世典文:十年编程(Teach Yourself Programming in Ten Years)
原文:Teach Yourself Programming in Ten Years作者:郭晓刚翻译:郭晓刚(foosleeper@163.net)最后修订日期:2004-3-192005-01-12 ...
- 海量并发的无锁编程 (lock free programming)
最近在做在线架构的实现,在线架构和离线架构近线架构最大的区别是服务质量(SLA,Service Level Agreement,SLA 99.99代表10K的请求最多一次失败或者超时)和延时.而离线架 ...
- Java 面向切面编程(Aspect Oriented Programming,AOP)
本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架--AspectWerkz 最近跳槽了,新公司使用了 AOP 相关的技术,于是查点资料,复习一下 ...
- 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性
一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...
- 【转】Linux下的多线程编程背景知识
1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...
随机推荐
- java的特点跨平台原理以及JDK的安装
终于开始了期待已久的java,了解java首先要了解下计算机语言的发展历史 机器语言--->汇编语言--->--->高级语言(面向过程的语言和面向对象的语言) 机器语言 每一个计算机 ...
- css3动画知识点
杨龙飞 杨龙飞 杨龙飞 杨龙飞 杨龙飞 杨龙飞 <!DOCTYPE html><html><head><style> div{width:100px;h ...
- sticky footer布局,定位底部footer
其作用就是当内容区域比较少时,让footer也能正常定位到底部,以前我们使用js来达到这种效果,其实用css也是完全可以的 <!DOCTYPE html> <html lang=&q ...
- 关于SQL的一些小知识
在代码中调用存储过程的时,必须先测试存储过程,存储过程测试成功之后再去java中去调用!!@!@#!@!@! 以后自己写的存储过程写一个本地保存一个.!~~~!!(这个很关键) 以后在代码中的SQL都 ...
- 老李分享:Uber究竟是用什么开发语言?
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- Script error.全面解析
一些用户向我们反馈,Fundebug的[JavaScript](https://docs.fundebug.com/notifier/javascript/)监控插件抓到了很多**Script err ...
- 使用Jersey实现图片服务器与应用服务器分离
现在模拟一下Jersey从客户端发送图片到服务器. 1.Tomcat准备 (1)解压一个新的Tomcat作为图片服务器,然后修改端口号(有3处). (2)然 ...
- Android -- 从源码带你从EventBus2.0飚到EventBus3.0(一)
1,最近看了不少的面试题,不管是百度.网易.阿里的面试题,都会问到EventBus源码和RxJava源码,而自己只是在项目中使用过,却没有去用心的了解它底层是怎么实现的,所以今天就和大家一起来学习学习 ...
- Unity3d中的PlayerPrefs游戏存档API的扩展
功能 在游戏会话中储存和访问游戏存档.这个是持久化数据储存,比如保存游戏记录. 静态函数 DeleteAll Removes all keys and values from the preferen ...
- jenkins+webhook+docker做持续集成
简介:我们现在都流行把项目封装成docker的镜像,不过实际用的时候就会发现很麻烦,我们每次更改代码了以后都要打包成docker容器 ,事实证明项目比较多的时候真的会让人崩溃,我这边用spring c ...