0

假设给定一组根据以下构造定义的“人”事实:

(deftemplate person (slot name) (slot sex) (allowed-values male female) (multislot children))

编写规则以执行以下操作:

  • 为出现在人员事实的子多槽中但不在任何人员事实的名称槽中的每个名称创建形式为 (unknown-person) 的事实(假设没有两个人具有相同的名字)
  • 对于表单 (unknown-person ) 的每个事实,向用户询问此人的性别,撤回该事实并声明表单 (unknown-person ) 的新事实。
  • 对于表单 (unknown-person) 的每个事实,撤回该事实并为该人创建一个新的人事实(假设该人没有孩子)。

您的规则应该进行数据验证,以确保用户只提供允许的值

4

1 回答 1

0

在 CLIPS 中定义模板:

(deftemplate person 
    (slot name) 
    (slot sex) 
    (slot gender (allowed-values male female)) 
    (multislot children))

从创建未知人开始(注意:这可能不完全正确,因为它仍然创建一个人而不检查他们是否存在)。

(defrule childrencataloguer "First layer of unknown person resolution"
    (person (children $?ch))
    =>
    (progn$ (?term ?ch)
        (assert (unknown-person ?term))
    ))

处理上面的警告

(defrule removeunknownswithpersonsalready
    (person (name ?n))
    ?up <-(unknown-person ?n)
    =>
    (retract ?up))

现在,获取性别:

(defrule getgender 
    ?up-nogen <-(unknown-person ?n)
    =>
    (retract ?up-nogen)
    (printout t crlf "Please enter male or female to indicate " ?n "'s gender" crlf )
    (assert (unknown-person ?n (read)))
)

还有其他方法可以进行性别确认,我本来希望使用 deftemplate 本身,以便允许的值可以用于验证。但我还不知道怎么做。

(assert (gender male))
(assert (gender female))

现在,进行验证:

(defrule checkgender
    ?p <- (unknown-person ?n ?s)
    (not (gender ?s))
    =>
    (retract ?p)
    (assert (unknown-person ?n))
)

终于,从未知毕业

(defrule graduatefromunknown
    (declare (salience -10))
    ?up <- (unknown-person ?n ?s)
    =>
    (retract ?up)
    (assert (person (name ?n) (sex ?s)))
)
于 2013-05-15T14:34:18.020 回答