我对开发网络应用程序还比较陌生。
我希望收到您对以下架构考虑因素的意见和改进建议。
我使用 CLIPS 开发了一个专家系统 ES。现在我计划将其作为 Web 应用程序提供给我们公司的各种用户。在开始讨论更多细节之前,我目前正在考虑应该涉及哪些技术。
目标是网络应用程序的用户面对一个类似聊天的动画,引导他或她向 ES 提供越来越多的输入,从而获得最终结果。
经过我自己的一些研究后,我提出了以下想法
在后端我使用 PyCLIPS 作为 Python 和 CLIPS 之间的接口
然后我使用 DJANGO 将我的 python 代码集成到网页中,动态改变用户和 ES 之间的聊天。
有一件事情至今仍然困扰着我:如何管理众多并发用户?我应该使用一个 ES,每个用户都有一组单独的事实,还是每个用户都应该有他或她自己的 ES 实例?
对于这个问题,您还有其他比这个更好的高级方法吗?
我期待您就此事提供经验和意见。
最好的
我有这个功课(我是学生),在CLIPS中,但我无法取得任何进展,尽管在谷歌搜索,并花了一些时间在它上面.
(clear)
(deftemplate book
(multislot surname)(slot name)(multislot title)
)
(book (surname J.P.)(name Dubreuil)(title History of francmasons))
(book (surname T.)(name Eker)(title Secrets of millionaire mind))
(defrule find_title
?book<-(book(name Eker))
=>
(printout t ?book crlf)
)
Run Code Online (Sandbox Code Playgroud)
我最终得到的是这个错误:"预期构造的开始".有什么想法吗?
我写了一个程序,断言本规则的LHS中的事实:
(defrule check-open-better (declare (salience 50))
?f1 <- (newnode (ident ?id) (gcost ?g) (fcost ?f) (father ?anc))
(status (ident ?id) (subject ?subject) (data $?eqL))
?f2 <- (status (ident ?old) (subject ?subject) (data $?eqL))
?f3 <- (node (ident ?old) (gcost ?g-old) (open yes))
(test
(eq
(implode$
(find-all-facts ((?f status))
(and
(eq(str-compare ?f:ident ?id) 0)
(eq(str-compare ?f:subject ?subject) 0)
(eq(str-compare (implode$ ?f:data) (implode$ $?eqL)) 0)
)
)
)
(implode$
(find-all-facts ((?f status))
(and
(eq(str-compare ?f:ident ?old) 0)
(eq(str-compare ?f:subject ?subject) 0)
(eq(str-compare …Run Code Online (Sandbox Code Playgroud) 你好,我有几个问题:
我想在规则运行时增加安全性.现在它什么都没改变.事实(human_resources n)确实存在.
(defglobal?security = 0)
(defrule rule1(human_resources n)=>(defglobal?security =(+?security 1)))
这导致?*security = 1 :( defglobal?security = 0)(defglobal?security =(+?security 1))
我有这个函数,它根据多个多场事实的多个槽来计算一些值.
因为涉及相当多的插槽并且在函数中需要所有插槽,我在想是否可以将整个事实传递给函数并访问其中的插槽,如下所示:
(deftemplate a-fact
(slot id)
(slot name)
(slot ...)
...
)
(deffunction a-funciton (?factadr)
(switch ?factadr:name
(case bla then ...)
)
(return ?calculated-value)
)
(defrule a-rule
?factadr <- (a-fact (id ?i))
=>
(if (> **(a-function ?factadr) 20) then ... )
)
Run Code Online (Sandbox Code Playgroud)
我看到了这个?fact-adrres:这个例子中的slot-name并认为它可以工作,但事实并非如此.那么,它是否可能以及如何做到这一点?
(bind ?facts (find-all-facts ((?f attribute))
(and (eq ?f:name wine)
(>= ?f:certainty 20))))
Run Code Online (Sandbox Code Playgroud)
使用剪辑6.3.
我正在尝试为示例规则绘制Rete网络,该规则在不同模式的变量之间没有绑定。我知道使用beta网络来确保不同模式下的弯曲变量保持一致。
(defrule R1
(type1 c1 c2)
(type2 c3)
=>
)
(defrule R2
(type2 c3)
(type3 c4 v1)
(type4 c5 v1)
=>
)
Run Code Online (Sandbox Code Playgroud)
在R1中,两个模式之间没有绑定变量,那么我该如何在Rete网络中合并它们的结果?在R2中,两个规则绑定了变量,而第三个没有绑定。如何在网络中结合这三个规则?我在这种情况下搜索了Rete网络示例,但未找到任何示例。我试图绘制网络,下面是我的网络。这样对吗?
更新:基于加里的答案的新网络
我正在做一个练习,我需要创建一个简单的约会机构匹配系统。目前每个人都有一种爱好,爱好按活跃和不活跃进行分类,如果两个爱好匹配并且两个人有异性,那么婚介所就认为这些人是匹配的。
所以现在我需要这个系统能够允许多种爱好,但我似乎无法理解这个问题。
这是我所拥有的:
(deftemplate MAIN::person
(slot name)
(slot age)
(multislot hobby)
(slot town)
(slot sex))
(person (name "Jane")
(age 25)
(hobby fashion gardening)
(town montrose)
(sex female))
(deffacts hobby_types "Hobby categories"
(hobby_type gardening active)
(hobby_type swinging active)
(hobby_type reading inactive)
(hobby_type fashion inactive)
)
(defrule compatible_hobbies
(opposite_sex ?name1 ?name2)
(person (name ?name1) (hobby ?hobby1))
(person (name ?name2) (hobby ?hobby2))
(hobby_type ?hobby1 ?type)
(hobby_type ?hobby2 ?type)
=>
(assert (hobbies_match ?name1 ?name2))
)
Run Code Online (Sandbox Code Playgroud)
首先,我是否正确声明了多槽字段?如何调整兼容的爱好规则以匹配一个人可能拥有的任何爱好?
CLIPS 对我来说相当陌生 - 我已经尝试深入研究这门语言两天了。我想到了一个问题,即:如何(如果可能)动态创建/添加新规则?我想做这样的事情:
(deftemplate action
(slot prev)
(slot curr)
)
(defrule test
(action (prev ?p))
=>
(defrule test_inner
(action (curr ?p))
=>
(printout t "Result of a newly created rule.")
)
)
Run Code Online (Sandbox Code Playgroud)
请不要特别注意这些规则的逻辑——这只是一个例子。调用上述命令后,我收到:
[EXPRNPSR3] Missing function declaration for defrule.
ERROR:
(defrule MAIN::test
(action (prev ?p))
=>
(defrule
Run Code Online (Sandbox Code Playgroud)
这个错误是命令语法的问题还是我无法“动态”定义新规则?
我是专家系统中的新手,尤其是CLIPS中的新手(也包括英语:-))。
我正在尝试使用复杂的比较谓词在事实中找到一个最大值(某种意义上)。比较谓词被实现为以两个事实作为参数的函数。简而言之,我需要CLIPS来处理所有事实,使用我的谓词进行比较,并返回一个最大的事实。
一种解决方案是使用CLIPS规则评估下一个表达式:
(存在x)而不存在((存在y)(y!= x)和(y> x))
其中“>”代表我的谓词,x和y是事实,例如:
(deftemplate fact (slot name ... ) ... )
(deffunction my-predicate ""
(?fact1 ?fact2)
...
)
(defrule find-max ""
?fact1 <- (fact (name ?name1) )
( not (test (my-predicate ?fact1 (fact (name ?name2 )))))
=>
...
)
Run Code Online (Sandbox Code Playgroud)
但是此示例由于我的谓词函数调用中有关第二个参数的错误消息而无法正常工作。
另一种解决方案是制作中间事实,该中间事实用谓词的比较函数的特定名称和值表示基本事实。但这需要多次迭代才能完成最终结果。
我更喜欢第一种解决方案,但我不知道如何编码。我想我需要在回答像这个问题。所不同的是,我的问题是关于整个事实的比较,而不仅仅是一个狭缝。
是否可以找到一次激活规则的最大值?如果可能,请说明如何。
如何在 CLIPS 中将符号转换为字符串,反之亦然,我尝试查看文档但没有帮助。
是否还有将字符串转换为整数的函数?
CLIPS 中数据类型转换的函数集?