跳转到内容

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

在这个查询中,我们询问了所有的儿子,但没有问他们的父母。


更多内容待续,待我更新维基 :-)。

华夏公益教科书