剪辑家族专家系统

Clips Family Expert System

我正在尝试用 Clips 编程语言实现一个基本的专家系统。我有 children 的知识库以及他们各自的 parents。我想设置一个规则,如果两个 children 具有相同的 parents 则它断言他们是兄弟姐妹的事实。


(deftemplate person "family tree"
          (slot name)
          (slot father)
          (slot mother))

(assert
        (person
                (name "William")
                (father "John")
                (mother "Megan")))
(assert
        (person (name "David")
                (father "John")
                (mother "Megan")))

(defrule sibling
        (person
                (name ?name1)
                (father ?x)
                (mother ?x))
        (person
                (name ?name2)
                (father ?y)
                (mother ?y)))

当我定义规则时出现语法错误:

Syntax Error:  Check appropriate syntax for defrule.

您的规则的正确语法是:

(defrule sibling 
   (person (name ?name1) (father ?x) (mother ?x)) 
   (person (name ?name2) (father ?y) (mother ?y)) 
   => 
   ...)

rule 中,template 被称为:

(template_name (slot_name value) (slot_name value)) 

规则分为两部分:LHS(左侧)定义满足该规则的条件,RHS(右侧)定义后续操作。

在 CLIPS 中,=> 运算符将两侧分开。

示例:

(defrule animal-is-a-duck
    (animal ?name)
    (quacks)
    (two legs)
    (lay eggs)
    =>
    (assert (animal ?name is a duck)))

您可以在 basic programming guide 中阅读更多关于 CLIPS 语法的信息。

你的规则应该是这样的:


    (defrule sibling 
        (person
                (name ?name1)
                (father ?x)
                (mother ?y))
        (person
                (name ?name2)
                (father ?x)
                (mother ?y))
        (test (neq ?name1 ?name2))
    =>
    (assert (siblings ?name1 ?name2)))

只有在匹配的每个事实中父亲和母亲是同一个人才能满足原规则。

此规则允许重复:


    f-3     (siblings "David" "William")
    f-4     (siblings "William" "David")

因此您可以在另一个规则中捕获它,或者您可以编写一个更复杂的规则(或另一个规则)也匹配当前生成的匹配兄弟姐妹事实。