В Haskell, следующее определение затруднительное принимается:обратное состояние монады в Coq
type RState s a = s -> (a, s)
bind :: RState s a -> (a -> RState s b) -> RState s b
bind sf f = \s ->
let (a, s'') = sf s'
(b, s') = f a s
in (b, s'')
Как я могу получить аналогичное определение принятое Coq? Моя попытка:
Definition RState (S A : Type) : Type := S -> A * S.
Definition bind (S A B : Type) (sf : RState S A) (f : A -> RState S B) : RState S B :=
fun s =>
let (a, s'') := sf s' in
let (b, s') := f a s in
(b, s'').
Но выдает следующее сообщение об ошибке:
Error: The reference s' was not found in the current environment.
Трюк работает в Haskell, потому что две привязки в 'let' выражения взаимно рекурсивный , IDK, как он работает в Coq, но я предполагаю, что есть какое-то «ключевое слово»? –
Вам также необходимо будет доказать завершение, используя обоснованную связь. Я не уверен, что это возможно здесь, не принимая также какой-либо дополнительный (доказательный?) Аргумент в 'bind' (возможно, конкретное обоснованное отношение к использованию). –