忽略 Defrule CLIPS 中的类似事实
Ignoring similar facts in Defrule CLIPS
我正在尝试使用 CLIPS 创建一个家谱程序。
我是 CLIPS 的新手,在我创建的 defrule 之一中遇到一些操作困难。
我要执行的操作是为彼此是兄弟姐妹的 children 创建事实。因此,对于每对 children,我希望程序生成 2 个新的兄弟姐妹事实 。但是该程序似乎生成了 4 个 - 它还 将每个 child 列为自己的同级 ...
我尝试用谷歌搜索解决方案,但我不知道如何让计算机不启动 if(?cn == ?sn)。
有人可以帮忙吗?
(deftemplate siblings
(slot subject-name)
(slot sibling-name)
)
(defrule set-siblings
(child
(child-name ?cn)
(parent-name ?p))
(child
(child-name ?sn)
(parent-name ?p))
=>
(assert (siblings
(subject-name ?cn)
(sibling-name ?sn))
)
修改您的第二个模式,使 child 匹配的名称必须不同于第一个模式中绑定的名称:
(defrule set-siblings
(child
(child-name ?cn)
(parent-name ?p))
(child
(child-name ?sn&~?cn)
(parent-name ?p))
=>
(assert (siblings
(subject-name ?cn)
(sibling-name ?sn))
)
我正在尝试使用 CLIPS 创建一个家谱程序。
我是 CLIPS 的新手,在我创建的 defrule 之一中遇到一些操作困难。
我要执行的操作是为彼此是兄弟姐妹的 children 创建事实。因此,对于每对 children,我希望程序生成 2 个新的兄弟姐妹事实 。但是该程序似乎生成了 4 个 - 它还 将每个 child 列为自己的同级 ...
我尝试用谷歌搜索解决方案,但我不知道如何让计算机不启动 if(?cn == ?sn)。
有人可以帮忙吗?
(deftemplate siblings
(slot subject-name)
(slot sibling-name)
)
(defrule set-siblings
(child
(child-name ?cn)
(parent-name ?p))
(child
(child-name ?sn)
(parent-name ?p))
=>
(assert (siblings
(subject-name ?cn)
(sibling-name ?sn))
)
修改您的第二个模式,使 child 匹配的名称必须不同于第一个模式中绑定的名称:
(defrule set-siblings
(child
(child-name ?cn)
(parent-name ?p))
(child
(child-name ?sn&~?cn)
(parent-name ?p))
=>
(assert (siblings
(subject-name ?cn)
(sibling-name ?sn))
)