Idris - 归纳步骤证明
Idris - proof on inductive step
考虑以下函数
tryMove : (diskNumber : Nat) -> (from: Peg) -> (to: Peg)-> {default Oh prf: So (from /= to)} -> Disposition diskNumber -> Maybe (Disposition diskNumber)
tryMove Z from to [] = Nothing
tryMove (S k) from to (smallestDiskPosition :: restOfTheDisposition) =
map (smallestDiskPosition ::) (tryMove k from to restOfTheDisposition)
尝试编译时出现以下错误:
When checking argument prf to Hanoi.tryMove:
Type mismatch between
So True (Type of Oh)
and
So (from /= to) (Expected type)
Specifically:
Type mismatch between
True
and
not (Hanoi.Peg implementation of Prelude.Interfaces.Eq, method == from to)
关于 tryMove
的递归调用。
如果我明确地通过 {prf}
作为
tryMove : (diskNumber : Nat) -> (from: Peg) -> (to: Peg)-> {default Oh prf: So (from /= to)} -> Disposition diskNumber -> Maybe (Disposition diskNumber)
tryMove Z from to [] = Nothing
tryMove (S k) from to {prf} (smallestDiskPosition :: restOfTheDisposition) =
map (smallestDiskPosition ::) (tryMove k from to {prf} restOfTheDisposition)
编译正确。
为什么 Idris 在归纳步骤中不能自动检测到证明,而在函数的正常调用中可以检测到?
编辑:
这里有完整的使用要点:https://gist.github.com/marcosh/d51479ea08e8522560713fd1e5ca9624
您为 prf
提供了默认值 (Oh
),因此 Idris 试图将 Oh
传递到递归调用中。
Oh
的类型为 So True
并且 Idris 期望 prf
的类型为 So (from /= to)
,但是由于您没有析构 to
和 from
,Idris无法知道 from /= to
的值,这就是您看到该错误消息的原因。
您可以更改签名以包含 {auto prf: So (from /= to)}
或完全删除 prf
参数,因为您实际上并没有使用它,您只是将它不作任何修改地传递到递归调用中。
考虑以下函数
tryMove : (diskNumber : Nat) -> (from: Peg) -> (to: Peg)-> {default Oh prf: So (from /= to)} -> Disposition diskNumber -> Maybe (Disposition diskNumber)
tryMove Z from to [] = Nothing
tryMove (S k) from to (smallestDiskPosition :: restOfTheDisposition) =
map (smallestDiskPosition ::) (tryMove k from to restOfTheDisposition)
尝试编译时出现以下错误:
When checking argument prf to Hanoi.tryMove:
Type mismatch between
So True (Type of Oh)
and
So (from /= to) (Expected type)
Specifically:
Type mismatch between
True
and
not (Hanoi.Peg implementation of Prelude.Interfaces.Eq, method == from to)
关于 tryMove
的递归调用。
如果我明确地通过 {prf}
作为
tryMove : (diskNumber : Nat) -> (from: Peg) -> (to: Peg)-> {default Oh prf: So (from /= to)} -> Disposition diskNumber -> Maybe (Disposition diskNumber)
tryMove Z from to [] = Nothing
tryMove (S k) from to {prf} (smallestDiskPosition :: restOfTheDisposition) =
map (smallestDiskPosition ::) (tryMove k from to {prf} restOfTheDisposition)
编译正确。
为什么 Idris 在归纳步骤中不能自动检测到证明,而在函数的正常调用中可以检测到?
编辑:
这里有完整的使用要点:https://gist.github.com/marcosh/d51479ea08e8522560713fd1e5ca9624
您为 prf
提供了默认值 (Oh
),因此 Idris 试图将 Oh
传递到递归调用中。
Oh
的类型为 So True
并且 Idris 期望 prf
的类型为 So (from /= to)
,但是由于您没有析构 to
和 from
,Idris无法知道 from /= to
的值,这就是您看到该错误消息的原因。
您可以更改签名以包含 {auto prf: So (from /= to)}
或完全删除 prf
参数,因为您实际上并没有使用它,您只是将它不作任何修改地传递到递归调用中。