1

私は自分の研究のためにCommonLispを使ってエキスパートシステムを作成しています。グローバル変数があります:BF- >ファクトベース。

私はそのように初期化します:

(defvar *BF* NIL)

ビッグデータでグローバル変数を設定する関数「initialize」への私の「メイン関数」呼び出し。

(defun initialize ()
(setf *BF* 
    '(
        (metric (
            (CPU-utilization NIL)
            (RPI NIL)
            (ART NIL)
            (concurent-invocation NIL)
            (stall-count NIL)
            (GC-bytes-in-use NIL)
            (available-thread NIL)
            (available-connection NIL)
            (instance-count NIL)
        ))
        (problem (
            (livelock T)
            (memory-leaks T)
            (code-inefficient T)
            (overload T)
            (under-allocation T)
            (internal-chokepoint T)
            (thread-leaks T)
            (blocking-deadlock T)
            (unending-retries T)
            (overuse-external-system T)
            (pig-in-a-python T)
            (too-many-layers T)
            (backend-bottleneck T)
            (frequent-GC-resource-leaks T)
            (slow-backend T)
            (suddenly-slow-backend T)
            (nonblocking-deadlock T)
            (thread-leaks T)
        )) 
        (category ( 
            (sudden T) 
            (consistent T) 
            (periodic T) 
            (progressive T) 
        ))
    )
)
)

この関数の最初の使用では、BFを印刷するときに問題ありません。次に、 BFを変更する関数を呼び出します。

(defun apply-rule (type name value)
    ; Get conclusion list for this rule
    (let ((conclusion (get-conclusion name value)))
        (if (null conclusion)
            (if (not (equal 3 value))
                (return-from appliquer-regle NIL)
                (return-from appliquer-regle 'T)
            )
        )
        ; Iterate on all problems in *BF*
        (dolist (e (cadr (assoc 'problem *BF*)))
            ; If the problem is not in conclusion list, set it value to false 
            (if (and (member (car e) conclusion) (equal (cadr e) 'T))
                ()
                (setf (cadr e) NIL)
            )
        )
        (return-from apply-rule 'T)
    )
    (return-from apply-rule NIL)    
)

この機能は動作します。しかし、「初期化」機能を再度使用したいのですが、動作しません。BFを出力すると、古い値が含まれています...グローバル変数を再初期化するにはどうすればよいですか?

英語でごめんなさい、私はフランス語です^

4

1 に答える 1

2

リテラルデータを変更しています。その影響はポータブルコードでは定義されていないため、これは避けるのが最善です。リテラルリストを共有することでスペースを節約するコンパイラを想像してみてください。

*BF*変数に新しく割り当てられたデータがあることを確認してください。変数を初期化するたびに、COPY-TREEを使用してリストをコピーします。

于 2012-12-28T14:57:15.227 に答える