1

移動を表す構造体があります

(struct move (tile x y rotations) #:prefab)

パスも許可されているので、アクションをテストする bool があります。

(define (action? v)
  (if (or (pass? v)
          (move? v))
      #t
      ;; else
      #f
  )
)

次のような動きを宣言できます

(define test (move (tile 'blue (list (posn 0 0 ) (posn 1 0) (posn 2 0) (posn 3 0) (posn 3 1))) 2 4 0))

そして、いつアクションをテストしますか?それは合格します:

(アクション? テスト) #t

ただし、このファイルを別のモジュールで使用すると、移動構造が有効な移動として受け入れられません。

状態遷移: 契約違反が予想されます: (and/c アクション? ???) 与えられた: '#s(move #s(タイル青 (#s(posn 0 0) #s(posn 1 0) #s(posn 2) 0) #s(posn 3 0) #s(posn 3 1))) 2 4 0) ではない: ???

教師から提供された状態遷移コントラクトは次のとおりです。

[state-transition (->i ([s state?]
          [a (s) (and/c action?
                (cut state-action-legal? <> s))])
         [result state?])] 

したがって、基本的に同じオブジェクトが 2 か所にあります。そのうちの 1 つはテストに合格し、もう 1 つは失敗して契約が破棄されます。なぜこうなった?

編集

これがstate-action-legalの定義ですか?

(define (state-action-legal? state action)
  (not (state-action-violation state action))
)

また、state-action-violationは、アクションが正当でない理由を示す文字列を返すか、アクションが正当な場合は #F を返します。手動でテストし、教師がユニットテストを提供して適切な実装を確認し、これらの関数がすべてに合格したため、両方が適切に機能していることがわかります。

編集を終了

ご協力ありがとうございました。

4

0 に答える 0