私は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)