Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clips 我们可以动态绑定多批值吗?_Clips - Fatal编程技术网

Clips 我们可以动态绑定多批值吗?

Clips 我们可以动态绑定多批值吗?,clips,Clips,我试图从多段中获取值,并将其动态分配给变量 假设我们有一个模板,如下所示: (fact (slot name) (multislot field) (multislot value)) (fact2 (slot field) (slot value)) 然后可以有如下规则: (rule (fact (name ?name) (field $?field) (value $?value))

我试图从多段中获取值,并将其动态分配给变量

假设我们有一个模板,如下所示:

(fact (slot name)
      (multislot field)
      (multislot value))

(fact2 (slot field)
       (slot value))
然后可以有如下规则:

(rule
       (fact (name ?name)
             (field $?field)
             (value $?value))
       ;if length of field and value is greater than 0 
       (fact2 (field ?field1)
              (value ?value1))
       ;if length of field and value is greater than 1 
       (fact2 (field ?field2)
              (value ?value2))
       ;if length of field and value is greater than 2 
       (fact2 (field ?field3)
              (value ?value3))
       ;if length of field and value is greater than 3 
       (fact2 (field ?field4)
              (value ?value4))
=>
       (assert (all field:values found))
在这里,事实可以只有一个字段值对,或者最多4个字段值对。我想要一个通用的单一规则,可以用来从多批次动态提取所有可用值

我想在上面的规则中,我们不仅需要提取值,还需要实现
if length>0
else if
之类的语句

因此,如果输入为:

(fact (name Employee)
      (field Name Role Department Company)
      (value Bob Admin Security ABC))
(fact2 (field Name)
       (value Bob))
(fact2 (field Role)
       (value Admin))
(fact2 (field Department)
       (value Security))
(fact2 (field Company)
       (value ABC))
那么预期的产出将是:

(all field:value pairs found)

而同样的规则也应该符合上述事实。这可能吗?或者有没有其他解决办法


先谢谢你

您基本上可以使用forall条件元素迭代每个字段/值。如果名称插槽不包含唯一值,并且您有多个事实事实,如果要对规则操作中的事实进行推理,则需要添加一个包含唯一值的槽,以便forall条件元素内外的事实模式匹配相同的事实

         CLIPS (6.31 4/1/19)
CLIPS> 
(deftemplate fact
    (slot name)
    (slot id (default-dynamic (gensym*)))
    (multislot field)
    (multislot value))
CLIPS> 
(deftemplate fact2
    (slot field)
    (slot value))
CLIPS> 
(deffacts initial
   (fact (name Employee)
         (field Name Role Department Company)
         (value Bob Admin Security ABC))
   (fact (name Employee)
         (field Name Age)
         (value Bob 38))
   (fact2 (field Name)
          (value Bob))
   (fact2 (field Role)
          (value Admin))
   (fact2 (field Department)
          (value Security))
   (fact2 (field Company)
          (value ABC)))       
CLIPS>               
(defrule reasoning
   (fact (id ?id))
   (forall
      (fact (id ?id) 
            (field $?f ?field $?) 
            (value $?v&:(= (length$ ?f) (length$ ?v)) ?value $?))
      (fact2 (field ?field)
             (value ?value)))
   =>
   (assert (all field:values found)))
CLIPS> (reset)
CLIPS> (agenda)
0      reasoning: f-1,*
For a total of 1 activation.
CLIPS> (ppfact 1)
(fact 
   (name Employee) 
   (id gen1) 
   (field Name Role Department Company) 
   (value Bob Admin Security ABC))
CLIPS> 
         CLIPS (6.31 4/1/19)
CLIPS> 
(deftemplate fact
    (slot name)
    (slot id (default-dynamic (gensym*)))
    (multislot field)
    (multislot value))
CLIPS> 
(deftemplate fact2
    (slot field)
    (slot value))
CLIPS> 
(deffacts initial
   (fact (name Employee)
         (field Name Role Department Company)
         (value Bob Admin Security ABC))
   (fact (name Employee)
         (field Name Age)
         (value Bob 38))
   (fact2 (field Name)
          (value Bob))
   (fact2 (field Role)
          (value Admin))
   (fact2 (field Department)
          (value Security))
   (fact2 (field Company)
          (value ABC)))       
CLIPS>               
(defrule reasoning
   (fact (id ?id))
   (forall
      (fact (id ?id) 
            (field $?f ?field $?) 
            (value $?v&:(= (length$ ?f) (length$ ?v)) ?value $?))
      (fact2 (field ?field)
             (value ?value)))
   =>
   (assert (all field:values found)))
CLIPS> (reset)
CLIPS> (agenda)
0      reasoning: f-1,*
For a total of 1 activation.
CLIPS> (ppfact 1)
(fact 
   (name Employee) 
   (id gen1) 
   (field Name Role Department Company) 
   (value Bob Admin Security ABC))
CLIPS>