SCIP - P16 逻辑式程序设计Ⅱ
第一小节:
构造一门语言的重要思想:
- 什么是基本元素 primary element
- 他们如果组合 combination
- 他们如何进行抽象 abstraction
上节课知道了如何使用查询语言,这节课我们来实现它(最底层的原理是模式匹配器 pattern matcher)
1.1 复习一波 pattern matcher 语法:
上图的语法是由 “MATCH” 这个procedure实现的
(MATCH pat data dictionary) --> 讨论的问题是 是否存在让pattern(参数1) 与 data object(参数2) match,在存在已知dictionary的情况下, 举例:
给定:
若匹配成功后的结果是:输出了一个扩展的字典 dictionary,否则输出FAIL
1.2 有了模式匹配器(pattern matcher )后,what is a primitive query? 基本查询是怎样的?(rather complicated things)
举例: (JOB ?x (?D . ?Y)) --> 如何在系统实现?
结构 --> two stream in (database, dictionary) , one stream out (成功后的扩展字典(并不只是一个),有些不成功的,不输出)(基本原理)
1.3 除了用流的方法,还有其他的方法来 arrange this match for a primitive query,
the answer is this thing extends elegantly to implement the means of combination.
举例(更复杂的组合形式):
(AND (JOB ?X (?D . ?Y)) (SUPERVISOR ?X ?Z)) --> 注意在这个查询框架下其实默认限定了 前后两个 ?X是一样的
AND 基本结构(有点像 串联的感jio)了解一下 (又其实就是封装了一层),表现为基本的元素了,2个输入流,一个输出流
OR 的结构,原理类似(有点像 电路中并联的结构):
NOT的结构,原理(不会对字典进行任何的扩展,仅仅只是 filter):
LISP-VALUE 原理类似,它的filter会更复杂,因为它要 applies to predicate(谓词)
【关键思想】:这是 闭包的思想, idea of closure, --> 我们通过组合手段构造的东西和基本的物件具有相同的结构
(AND JOB SALARY) 和 (AND JOB (NOT ...)) --> 带来便利
提问:最初的字典来自哪里?
回答:最出开始是用空字典进行初始化的,随着查询,会不断的扩充字典(注意这些扩充的字典仅仅是在内存中,并不会直接存入数据库,除非你要存它,举例AND的查询中间的输出字典用于下一个query,这个字典仅仅是 temporary)。
提问:AND 查询中,把第一个query中数据库中的流传递到下一个query是否冗余,因为如果第一个query中判断没有的,第二个query有些也需要重复判断?
回答:图中仅仅是简单情况,实际中可以通过安排AND子句的顺序来消除不同类型的冗余,这也是这门查询语言prolog慢的原因之一
提问:Did you model the language on Prolog or did it just come out looking like Prolog?
回答:我们 是根据查询处理的基本原理建模在1971,但那时候没用流来实现,但是使用的时候会有各种的问题(稍后提到 ) 从某种意义上来说它是Prolog(prolog 不是基于流,使用回溯策略 backtracking strategy,但是prolog的编译器经过的精心设计,所以可以高速运行)。这节课是我们设计的语言 行为上很像prolog。
第二小节:
上个小节 我们知道了 基本的查询和 以及如何使用流来实现 means of combination组合方式。
我们看下第三部分,如何进行抽象 Abstraction , the means of abstraction in this language are rules
注意把刚才 的 AND 在最外层进行的封装,整一个大的框。