程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

我们如何在 Jess 规则中从终端选择默认值

发布于2024-03-09 13:32     阅读(450)     评论(0)     点赞(2)     收藏(1)


我用 Jess 编写了代码:

;;;*************
;;;* MODULES   *
;;;*************

(defmodule EXAMPLE)

;;;*************
;;;* TEMPLATES *
;;;*************

(deftemplate EXAMPLE::status
(slot name)
(slot age)
)

;;;*************
;;;* FACTS     *
;;;*************

(deffacts EXAMPLE::?x
(status (name Peter)
    (age 24)
)
)

;;;***********************
;;;* GENERATE PATH RULES *
;;;***********************

(defrule EXAMPLE::rule1
    ?res <-
    (status (name Peter)
        (age 24)            
    )
    => 
    (printout t "Hello Peter" crlf)
    (restract ?res)
)

(run)

如何从我的终端使用 ?x 调用规则。

因为我想找到名为 ?x 的事实并仅搜索该事实的规则。我希望我的条目类似于 (Peter) which Peter=?x 。


解决方案


正确的方法是 (1) 使用显式触发事实,或 (2) 使用 adefquery而不是 adefrule —— 查询很像规则,只不过您可以显式调用查询。

第一种方法看起来像

(defrule EXAMPLE::rule1
    (greet ?x)
    ?res <- (status (name ?x))
    => 
    (printout t "Hello, " ?x "!" crlf)
    (retract ?res))


Jess> (assert (greet Peter))
<Fact-1>
Jess> (run)
Hello, Peter!

而第二个看起来像这样:

(defquery EXAMPLE::query1
    (declare (variables ?x))
    ?res <- (status (name ?x))))


Jess> (bind ?result (run-query* EXAMPLE::query1 Peter))
Jess> (while (?result next)
          (printout t "Hello, " (?result getString ?x) crlf)
          (retract (?result getObject res)))

您可以在此处阅读有关查询的更多信息



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/686170/41a3eee7e3b874222af9/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

2 0
收藏该文
已收藏

评论内容:(最多支持255个字符)