事实陈述
在Pyke中,陈述句是关于事实的陈述,可直接叫做“事实”。“事实”,是 Pyke 推理行为的根据,算是 Pyke 干活必备的家常便饭吧。
可以把事实陈述当做说话的句子。比如,例程 family_relations 中这样处理亲属关系:
“Bruce 是 Thomas (他的父亲) 和 Norma (他的母亲) 的儿子。”
让我们把句子简化些。这句话涉及3个人:Bruce, Thomas 和 Norma,其余的则是表示3人之间关系的标识。简化成:
简化的事实陈述,可以任意命名,这里是叫 son_of。也可以叫“parents_of”,表示下面的意思:
但是,son_of 这个事实有额外的信息,即 Bruce 是儿子,不是女儿。
警示!
事实陈述不是函数!son_of(Bruce, Thomas, Norma) 的长相,像是 Python 函数的样子,但它不是函数调用语句!可能期待它会执行、做些事情、返回值。但是,它的确只是个事实陈述,是个数据,它不做任何事情,也从不返回值。
注意,不同的事实陈述,可以表示相同的逻辑关系:
只有参数不同,事实陈述才有意义。不需要重复陈述同一事实。如果真地出现相同的事实陈述,则只保留一个,其余的均被忽略:
son_of(Bruce, Thomas, Norma)
son_of(Bruce, Thomas, Norma)
son_of(Bruce, Thomas, Norma)
完全等同于:
son_of(Bruce, Thomas, Norma)改变了参数的顺序,就改变了事实的本意:
son_of(Bruce, Norma, Thomas)
事实陈述的句法结构
已经看到,Pyke 的事实陈述语句,是高度结构化的。
注意
Pyke 知识库是一维结构,知识库中只有事实陈述语句,不允许包含其他知识库。同时,事实陈述语句也是一维结构,句中不能包含其他语句。
事实陈述句由三部分组成:
- 知识库名称,如: family.
- 知识单元名称,如:son_of.
- 参数,直接以 Python 数据表示。 目前的 Pyke,趋向于参数不可变化。
事实陈述的句法是这样的:
知识库
第一个标识,是知识库名称。在例程 family_relations 中,知识库名字叫做 family。
注意
在反向推理过程中,可以省略知识库的名字。当前选定的规则库,默认是规则库的类别。
知识单元
第二个标识,是知识单元的名称,它表示参数之间的关系。可看做事实的类型或主题。例如, son_of 是表示事实的一种类型,由(儿子,父亲,母亲)三个参数构成。
参数
参数可以是 Python 简单的数据结构(数字,字符串,None,True 或 False),或者由它们组成的元组(包括嵌套的元组)。目前,事实陈述是固定不变的,因此,参数也是如此。
注意
Prolog 允许参数是其他事实陈述名称,但 Pyke 不允许。因为,Pyke 需要与 Python 集成,而 Python 没有“事实陈述”的概念,于是,我们就在 Pyke 中用元组。在 Python 编程中使用元组,是件开心的事情。
family.son_of(Bruce, Thomas, Norma)