回答集编程背景(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.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
下面是我查询数据库时打印出来的异常信息: ### Error querying database. Cause: java.sql.SQLException: Value '0000-00-00 0 ...
- Excel 按模板格式导出
最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图 如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模 ...
- HTML5 的WebSocket
认识HTML5的WebSocket
- Python之路-操作系统&网络基础
一.为何要有操作系统 没有操作系统的话,计算机同样可以运行,但是程序员要了解到计算机底层各种各样的细节,而操作系统聪明地封装起来了底层这些繁杂的操作,通过向程序员开放一个个的接口,来最终使我们实现对底 ...
- LwIP之socket应用--WebServer和Modbus TCP
1. 引言 LwIP是嵌入式领域一个流行的以太网协议栈, LwIP开放源码,用C写成非常方便移植,并且支持socket接口,使用者可以集中精力处理应用功能. 本文就是LwIP socket使用的一个小 ...
- SQL编程的一些良好好习惯
|转载自:cnblog |原文链接:http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html 我们做软件开发的,大部分人都离不开跟数据库 ...
- Windows安装mysql-python提示:error: Microsoft Visual C++ 9.0 is required
Windows安装mysql-python提示:error: Microsoft Visual C++ 9.0 is required,Get it from http://aka.ms/vcpyth ...
- 关于block使用的几点注意事项
1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock == NULL) { // ...
- 《深入理解Java函数式编程》系列文章
Introduction 本系列文将帮助你理解Java函数式编程的用法.原理. 本文受启发于JavaOne 2016关于Lambda表达式的相关主题演讲Lambdas and Functional P ...
- Dubbo的使用简介
Dubbo是什么 官方定义 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000, ...