作者ephesians (ephesians)
看板PLT
标题[闲聊] 逻辑式语言与函数式语言
时间Sun Feb 25 04:24:03 2007
最近在涉猎另一种程式语言流派,
不是天流地流与神流,不是二刀流,也不是人称一流剑一流,
是一种叫做函数式语言 (functional programming language) 的.
先声明,因为以往工作与学习环境并不熟悉这东西的实作,
以下凡谈到底层,含编译/直译等,都是胡扯瞎掰的.
如果有幸,将来可能有机会实作.
函数式语言的特色就是函数定义,写完函数,程式就写完了.
跟传统程式语言 (结构化程式) 有什麽差别呢?
按数学来讲,函数是指将定义域映射到值域,
而传统程式语言的函数,除了映射之外,
还多了很多东西, (流程控制,例外处理,资源管理...等)
所以更称为函式.
函数式语言没有指定叙述,没有副作用 (side effect), 也没有流程控制.
可想而知,递回是函数式语言常用的东西,因为递回有隐性的流程控制功能.
这时候可能看棺...呃,看倌们会想到函数式语言程式有多慢,
但因为函数式语言没有副作用,意指一个子函数只做它该做的事,其他不多做.
譬如隔壁 p 版正在讨论的 int x=12; x=x+++++x; 疑义,
在函数式语言的世界是完全无效的!
哪个子运算式/子函数先计算,结果都一样.
因此,一份函数呼叫可以被自由代换为它的函数内容,不改其义.
递回函数很慢,展开成非递回函数就快多了.
(甚至或许底层不需要有传统语言编译器的函式控制记忆区)
函数式语言之所以没副作用,那是因为所有的变数一使用就不改其值.
没有指定叙述可以修改变数内容.
接下来再讲讲逻辑式语言, (logical programming language)
逻辑语言的基本构件是逻辑式.
用过 Prolog 的人也许会觉得 a :- b, c. 是规则, (if b and c then a)
但这样很容易陷入规则式推论系统的框架中,误以为一旦使用 Prolog,
就非得实作规则式推论系统.
事实上,那是 !b || !c || a 这般逻辑式 (此式借用C的符号), 称为Horn clause.
(Horn clause到底怎麽翻译啊? 角句吗?)
逻辑式语言的程式,就是许多逻辑式的集合,
称为演绎式资料库 (deductive database, DDB).
逻辑式语言的计算,在於掌握解集. (answer sets, 答案集)
回想范式图 (Van diagram), 如果你有一则逻辑式 a :- (意指 a 恒真;已知 a),
你就会将一张代表宇集 U 的白纸划为两半,一半在线圈内,属於 a/true 的范围,
另一半在线圈外,属於 ﹁a/false 的范围.
当你有另一则逻辑式 b :-, 就在纸上画另一个线圈.
加上一则逻辑式 c :- a, b, 是让 a 线圈与 b 线圈有个交叠部份.
计算一则问题 ?- c 是与解集周旋,通过逻辑式的交叉火网,在那张白纸上画地图.
有些问题经计算後,会得到多种解集,譬如:
在DDB a :- ﹁b, c. b :- ﹁a, c. 中,
询问 c 会得到 {a, ﹁b} 或 {﹁a, b} 二种解集.
解集的计算,称为解集规划 (answer set programming).
演绎式资料库已经有一串发展脉络,随着逻辑式可用符号的增加,解集规划也更复杂.
按着发展脉络及系统层次,简单地介绍於下:
1. DDB: 这个层次很低,很单纯,没有否定的述词 (predictive).
2. Monotonic DDB: 改良 DDB 的缺点,增加了 ﹁ 符号,
其语意是指某述词的存在不成立.
* DDB 与 MDDB 的层次相同,之後则是一层高於一层.
3. Extended Logic Programming (eLP, XD):
﹁ 符号的语意不够完整. (试想想 "我不喜欢你" 与 "我没有喜欢你" 的差别.)
因此,新的 not 符号诞生了,任务是明确表达某述词的存在不存在都未定义.
述词的否定符号优先顺序是先判断 not 述词是 unknown,
再判断 ﹁ 述词是真的没有.
4. Disjunctive Logic Programming: 终於可以使用 or 符号了.
5. Epistemic Logic Programming: 再加上一些很高阶的符号,
例如 K 代表已知为真 (it's Known to be true),
M 代表必须为真 (it Must be true)
至於实作层面,不管是直译或编译皆可,想必都要附加一份引擎.
(流程控制不是该烦恼的事,函义/语意才是.)
相较之下,传统程式语言不需要附加引擎,不过,所写的程式本身就是引擎.
你要先把引擎的流程控制/副作用搞定. 辛苦的程式工人啊!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.112.224.119
1F:推 semop:Horn clause 是以 Alfred Horn 为名的... 02/25 14:10
2F:→ ephesians:所以应该称为Horn的句子 02/25 14:44