2017-06-15 4 views
0

CLIPSの各マルチスロットを他のファクトと照合する可能性はありますか?CLIPS:すべての値が他のファクトと異なる場合、マルチスロットにマッチする

(stn-action (id ?id) (name lock-position) (state pending) 
      (cond-actions) (opts ?r ?action ?to)) 
(stn-action (id ?other-id) (name lock-position) (state running|finished) 
      (opts ?r ?action ?other-to&:~(eq ?other-to ?to))) 

COND-アクション多門と私はそれぞれの値が第2のラインと一致したという事実に対してマッチさせたい:私は短い例のルールがあります。明らかに、私はメンバー$とマッチする必要がありますが、私のファクトベースでは、各メンバーをどのように違うファクトと照合するのか分かりません。これを行う可能性はありますか?

(stn-action (id 3) (name lock-position) (state pending) (duration 0) 
      (cond-actions 1 2) (opts R-1 PICK-CC C-CS2-I) (active-robot R-1) (sync-id 1000003)) 
(stn-action (id 2) (name lock-position) (state running) (duration 0) 
      (cond-actions 1) (opts R-1 GET-PROD C-CS2-O) (active-robot R-1) (sync-id 1000002)) 
(stn-action (id 1) (name lock-position) (state finished) (duration 0) 
      (cond-actions) (opts R-1 GET-PROD C-BS-O) (active-robot R-1) (sync-id 1000001)) 

私の古いソリューションは、アクションの完了時にすべてのフィールドからIDを削除することでしたが、原因別の問題に、私はこのもう

答えて

1

使用を行うことはできません。一致する完全な事実の短いセットはこのようになります。 forall条件要素:

CLIPS> 
(deftemplate stn-action 
    (slot id) 
    (slot name) 
    (slot state) 
    (slot duration) 
    (multislot cond-actions) 
    (multislot opts) 
    (slot active-robot) 
    (slot sync-id)) 
CLIPS>  
(deffacts initial 
    ;; id 3 will not match because PICK-CC doesn't match GET-PROD 
    (stn-action (id 3) (name lock-position) (state pending) (duration 0) 
       (cond-actions 1 2) (opts R-1 PICK-CC C-CS2-I) 
       (active-robot R-1) (sync-id 1000003)) 
    (stn-action (id 2) (name lock-position) (state running) (duration 0) 
       (cond-actions 1) (opts R-1 GET-PROD C-CS2-O) 
       (active-robot R-1) (sync-id 1000002)) 
    (stn-action (id 1) (name lock-position) (state finished) (duration 0) 
       (cond-actions) (opts R-1 GET-PROD C-BS-O) 
       (active-robot R-1) (sync-id 1000001)) 
    ;; id 6 will match 
    (stn-action (id 6) (name lock-position) (state pending) (duration 0) 
       (cond-actions 5 4) (opts R-1 PICK-CC C-CS2-I) 
       (active-robot R-1) (sync-id 1000003)) 
    (stn-action (id 5) (name lock-position) (state running) (duration 0) 
       (cond-actions 4) (opts R-1 PICK-CC C-CS2-O) 
       (active-robot R-1) (sync-id 1000002)) 
    (stn-action (id 4) (name lock-position) (state finished) (duration 0) 
       (cond-actions) (opts R-1 PICK-CC C-BS-O) 
       (active-robot R-1) (sync-id 1000001))) 
CLIPS> 

(defrule match 
    (stn-action (id ?id) 
       (name lock-position) 
       (state pending) 
       (opts ?r ?action ?to)) 
    (forall (stn-action (id ?id) 
         (cond-actions $? ?other-id $?)) 
      (stn-action (id ?other-id) 
         (name lock-position) 
         (state running | finished) 
         (opts ?r ?action ?other-to&~?to))) 
    => 
    (printout t "id " ?id " has all cond-actions satisfied" crlf)) 
CLIPS> (reset) 
CLIPS> (run) 
id 6 has all cond-actions satisfied 
CLIPS> 
関連する問題