移動を表す構造体があります
(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 を返します。手動でテストし、教師がユニットテストを提供して適切な実装を確認し、これらの関数がすべてに合格したため、両方が適切に機能していることがわかります。
編集を終了
ご協力ありがとうございました。