我正在尝试使用Clips编程语言实现基本专家系统。我和他们各自的父母有一个孩子的知识基础。我想建立一个规则,以便如果两个孩子拥有相同的父母,那么它就断言他们是兄弟姐妹。
(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.
答案 0 :(得分:0)
规则的正确语法是:
(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语法的更多信息。
答案 1 :(得分:0)
你的规则应该是这样的:
(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")
因此您可以在另一个规则中捕获它,或者您可以编写一个更复杂的规则(或另一个规则)也匹配当前生成的匹配兄弟事实。