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

但是,当我在不同的模块上使用此文件时,移动结构不被接受为有效移动:

状态转换:预期违反合同:(和/c行动????)给定:'#s(move #s(tile blue(#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?])] 

所以我在两个地方有基本相同的对象。在其中一个中它通过了测试,而在另一个中则失败并且合同被破坏。为什么会这样?

编辑

这是状态-行动-法律的定义?

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

state-action-violation返回指示该操作不合法的原因的字符串,如果该操作是合法的,则返回 #F。我知道它们都可以正常工作,因为我们手动测试了它们,老师提供了单元测试以确保正确实施,并且这些功能都通过了。

结束编辑

谢谢您的帮助。

4

0 回答 0