Introspector/KifTutorial
这是一个基于知识交换格式的简短示例教程。它不完整,也不完全正确,但它应该让你对 KIF 可以做什么有一个了解。
我在这里使用的知识库是对人际关系的简单表示。基本上存在两种关系:家庭和朋友。家庭有三种:父亲、母亲、孩子。朋友只有一种。为了我们的目的,合作伙伴也是朋友。让我们从输入一些数据开始
(male Fred) (male John) (female Martha) (female Joan) (female Betty) (female Alice)
Fred 和 John 是男性,Martha、Joan、Betty 和 Alice 是女性。
(father Fred John)
John 是 Fred 的父亲
(mother Fred Martha)
Martha 是 Fred 的母亲
(father Pete Fred)
Fred 是 Pete 的父亲
(mother Pete Joan)
Joan 是 Pete 的母亲
(friend Pete Betty)
Betty 是 Pete 的朋友
(mother Alice Martha)
Martha 是 Alice 的母亲
(mother Betty Alice)
Alice 是 Betty 的母亲
现在,如果我们能从这些关系中得到一些信息就好了。例如,_我们_知道 Fred 是 Pete 的孩子,但计算机不知道。让我们告诉他这一点。
(defrelation child (?p ?c) := (or (mother ?c ?p) (father ?c ?p)))
现在我们说,有人,现在称为 ?c,是某个人的孩子,现在称为 ?p,如果 ?p 是 ?c 的母亲,或者如果 ?p 是 ?c 的父亲。
让我们定义一些其他关系
(defrelation son (?p ?c) := (and (male ?c) (child ?p ?c))) (defrelation daughter (?p ?c) := (and (female ?c) (child ?p ?c)))
儿子是男性孩子。女儿是女性孩子。
现在开始查询,从知识库中获取信息。以下是一些查询及其结果,在 => 后面。
(male Fred) => true (female John) => false
这些都是简单的查询,只返回真或假。请注意,您的实现可能会以不同的方式显示结果(因为我在编写本文时根本没有使用解释器(除了我的大脑),所以这实际上是合乎逻辑的)。
(male ?x) => ?x = Fred, ?x = John
在这里,我们询问系统:对于话语宇宙(现在称为 ?x)中的每个对象(包含所有存在的对象的集合)是男性((male ?x) => true),告诉我 ?w 的值是什么。
下一个例子,使用两个变量进行查询
(daughter (?x ?y)) => (?x = Alice, ?y = Martha), (?x = Betty, ?y = Alice)
如您所见,使用两个变量也会产生正确的结果。
现在让我们在查询中进行选择。假设我们想要 Fred 的姐姐。
(and (daughter (?x ?y)) (son (?x Fred))) => (?x = Martha, ?y = Alice)
您可以想象,我们可以用它来编程关系
(defrelation sister (?s ?o) := (and (daughter ?x ?y) (child ?y ?o)))
现在到“底部”。有时您想说:这可以是任何东西,但我并不关心它是什么。KIF 通过底部支持这一点。如果您写底部,您就是在说:这可以是任何东西,但您不会被告知它是什么。例如
(son bottom ?x) => ?x = Fred, ?x = Pete
在这个查询中,我们询问了所有的儿子,但没有问他们的父母。
更多内容待续,待我更新维基 :-)。