首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在剪辑中创建规则,使其从未知的个人事实转移到已知的个人事实。

在剪辑中创建规则,使其从未知的个人事实转移到已知的个人事实。
EN

Stack Overflow用户
提问于 2013-05-15 14:34:18
回答 1查看 218关注 0票数 0

假设为您提供了一组根据以下构造定义的“person”事实:

代码语言:javascript
复制
(deftemplate person (slot name) (slot sex) (allowed-values male female) (multislot children))

编写规则执行以下操作:

  • 为出现在一个人事实的多个位置的孩子中的每个名字创建一个表单事实(未知人),而不是在任何一个人事实的名称槽中(假设没有两个人有相同的名字)。
  • 对于表单中的每一个事实(未知人),请用户询问该人的性别,撤回该事实并断言该表单的新事实(无名人)。
  • 对于表单中的每一个事实(未知人),撤回事实并为该人创建一个新的人事实(假设此人没有子女)。

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

EN

回答 1

Stack Overflow用户

发布于 2013-05-15 14:34:18

在剪辑中定义模板:

代码语言:javascript
复制
(deftemplate person 
    (slot name) 
    (slot sex) 
    (slot gender (allowed-values male female)) 
    (multislot children))

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

代码语言:javascript
复制
(defrule childrencataloguer "First layer of unknown person resolution"
    (person (children $?ch))
    =>
    (progn$ (?term ?ch)
        (assert (unknown-person ?term))
    ))

处理上面的警告

代码语言:javascript
复制
(defrule removeunknownswithpersonsalready
    (person (name ?n))
    ?up <-(unknown-person ?n)
    =>
    (retract ?up))

现在,得到性别:

代码语言:javascript
复制
(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)))
)

还有其他的方法,你可以做性别确认,我本来希望使用反模板本身,以便允许的-值将输入到验证。但我不知道是怎么回事。

代码语言:javascript
复制
(assert (gender male))
(assert (gender female))

现在,进行验证:

代码语言:javascript
复制
(defrule checkgender
    ?p <- (unknown-person ?n ?s)
    (not (gender ?s))
    =>
    (retract ?p)
    (assert (unknown-person ?n))
)

最后,从未知中毕业

代码语言:javascript
复制
(defrule graduatefromunknown
    (declare (salience -10))
    ?up <- (unknown-person ?n ?s)
    =>
    (retract ?up)
    (assert (person (name ?n) (sex ?s)))
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16567948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档