0

私は8パズルの問題を解決するためにスキームでbfsを実装することを検討していました.これは私がこれまでに持っているコードです(デバッグできないエラーを与えます)::

;;構造を定義するためのいくつかの演算子
(空白を定義する '空白)
(深さ 0 を定義)(パスコスト 0 を定義)
(定義 nw 0)
(定義 n 1)
(ne 2 を定義)
(w 3 を定義)
(定義 c 4)
(定義 e 5)
(sw 6 を定義)
(定義 s 7)
(se 8 を定義)
(定義左 '左)
(右 '右を定義)
(アップアップを定義)
(定義ダウン 'ダウン)

;;ノードを作る関数
(make-node を定義する
  (ラムダ (状態の親演算子の深さのパスコスト)
    (リスト状態の親演算子の深さのパスコスト)))

(拡張手順を定義する
  (ラムダ (カレントレスト)
    (残りを追加 (gen-nodes curr (valid-moves (car curr))))))

(世代ノードを定義する
  (ラムダ (ノード移動)
    (状態
      [(null? 移動) '()]
      [そうしないと
       (letrec ((生成状態
                (ラムダ (ノード演算子の移動)
                  (もし (ペア? が動く)
                      (短所
                       (make-node (operator (car node)) (append (car node) (car (cdr node))) operator (+ 1 (car(cdr(cdr(cdr node)))))) 1)
                       (gen-states ノード (車の移動) (cdr の移動)))
                      (make-node (operator (car ノード)) (append (car ノード) (car (cdr ノード))) operator (+ 1 (car(cdr(cdr(cdr ノード))))) 1)))))
                (gen-states ノード (車の移動) (cdr の移動)))])))

(not-visited-parent を定義する
  (ラムダ (新規リスト)
    (if (ペア? リスト)
        (if (eqv? new (車リスト))
            #f    
            (未訪問 (cdr リスト) 新規))
        (if (eqv? 新しいリスト)
            #f
            #t))))

(not-visit-other を定義する
  (ラムダ (新規リスト)
    (if (ペア? リスト)
        (if (eqv? new (車 (車リスト)))
            #f    
            (未訪問 (cdr リスト) 新規))
        (if (eqv? new (車リスト))
            #f
            #t))))

(find-blank を定義する
  (ラムダ (ls ref)
    (状態
      [(eq? ref 9) null]
      [(eq? (list-ref ls ref) 'blank) ref]
      [else (find-blank ls (+ ref 1))])))


;;空白を移動する演算子    
(左を定義
  (ラムダ (状態)
    (スワップ状態 (空白検索状態 0) (- (空白検索状態 0) 1))))

(右を定義
  (ラムダ (状態)
      (スワップ状態 (空白検索状態 0) (+ (空白検索状態 0) 1))))

(定義する
  (ラムダ (状態)
    (スワップ状態 (空白検索状態 0) (- (空白検索状態 0) 3))))

(下に定義
  (ラムダ (状態)
    (スワップ状態 (空白検索状態 0) (+ (空白検索状態 0) 3))))

; ref1 を ref 2 の値に設定
(set-ref を定義してください!
  (ラムダ (リスト ref1 値 iter)
    (if (eqv? iter 9)
        '()
        (if (ペア? リスト)
            (短所
             (if (eq? ref1 iter)
                 価値
                 (list-ref リスト iter))
             (set-ref! list ref1 値 (+ iter 1)))
            (if (eq? ref1 iter)
                 価値
                 (リスト参照リスト iter))))))

(スワップを定義する
  (ラムダ (状態 ref1 ref2)
    (始める
      (temp を定義する (list-ref state ref1))
      (set! state (set-ref! state ref1 (list-ref state ref2) 0))
      (セット! 状態 (セット-ref! 状態 ref2 temp 0))
      州)))

;;指定された状態の有効な動きを返します  
(有効な動きを定義する
  (ラムダ (状態)
    (ケース (検索空白状態 0)
      ([0] (右下にリスト))
      ([1] (左から右へのリスト))
      ([2] (リスト左下))
      ([3] (リストの右上))
      ([4] (左右上下のリスト))
      ([5] (リストの左上))
      ([6] (右上にリスト))
      ([7] (左から右へのリスト))
      ([8] (リスト左上))
      (そうしないと '()))))  

;;目標状態に到達したかどうかをテストする手順
(テスト手順を定義する
  (ラムダ (状態)
    (if (eq? (車の状態) ゴール)
        #t
        #f)))

;;一般的な検索手順
(一般検索を定義する
  (ラムダ (キュー テスト プロシージャ 展開プロシージャ 制限 num-runs 出力プロシージャ)
    (状態
     [(null? queue) #f] ;キューが空です - 目標状態が見つかりません - 非常にありそうにないシナリオ - 一部のボゾが状態空間から出ない限り
     [(test-procedure (car queue)) (output-procedure num-runs (car queue))] ;目標状態に到達??
     [(zero? limit) "Limit reached"] ;限界に達した停止
     [else (一般検索
     (expand-procedure (car キュー) (cdr キュー))
      test-procedure expand-procedure (- limit 1) (+ num-runs 1) output-procedure)])))

(出力手順を定義する
  (ラムダ (num-runs ノード)
    (始める
    (実行数を表示)
    (表示 "\n")
    (display (list-ref (car node) nw))
    (display (list-ref (車ノード) n))
    (display (list-ref (car node) ne))
    (表示 "\n")
    (display (list-ref (car node) w))
    (display (list-ref (車ノード) c))
    (display (list-ref (車ノード) e))
    (表示 "\n")
    (display (list-ref (car node) sw))
    (display (list-ref (car node) s))
    (display (list-ref (car node) se)))))

;;テスト関数    
(make-initial-state を定義
  (ラムダ (nw n new wce sw s se)
    (リスト nw n new wce sw s se)))

(make-goal-state を定義する
  (ラムダ (nw n new wce sw s se)
    (リスト nw n new wce sw s se)))

(test-uninformed-search を定義する
  (ラムダ (初期目標制限)
    (始める
      (define queue (list (make-node init '() '() 0 1)))
      (一般検索キュー テスト手順 拡張手順 制限 0 出力手順))))

(init 定義 (make-initial-state 1 2 3 4 5 6 7 blank 8))
(ゴールを定義する (make-goal-state 1 2 3 4 5 6 7 8 blank))
(テスト-情報なし-検索の初期目標 2000)
4

1 に答える 1

1

私は得ています

module: duplicate definition for identifier in: left

エラーとして、これは left for を 1 回以上定義していることを意味します。(私は DrRacket で実行しているので、あなたのものとは異なるかもしれません。)

最初にそれを修正してみてください。

于 2010-11-05T02:42:30.570 に答える