所以我在Agda中构建一个简单的文本编辑器,并试图在某些击键后编写校样以检查缓冲区的修改是否正确。我现在正在工作的那个是检查光标输入是不是修改缓冲区内的文本,只是光标的位置。
我有一个实用程序函数将我的缓冲区类型转换为char的列表:
Buffer -> List Char
Input:
[] <: ('H' :> 'E' :> 'L' :> 'L' :> 'O' :> []) <[
[] <: 'H' <[ <> ]> 'I' :> [] ]>
('H' :> 'E' :> 'L' :> 'L' :> 'O' :> []) :> []
Output:
('H' :> 'E' :> 'L' :> 'L' :> 'O' :> []) :>
('H' :> 'I' :> []) :> ('H' :> 'E' :> 'L' :> 'L' :> 'O' :> []) :> []
问题:在比较仿函数的输入和输出时,它们是反身的。然而,当我尝试将其编译为refl
时,证据将无法编译,是否有一些我可能会忽略或丢失的内容,例如Agda有一些其他条件需要满足于完全反身的东西?
证明定义:
postulate
within_turn_into_because_ :
{X Y : Set}(f : X -> Y)(x x' : X) ->
x == x' -> f x == f x'
数据类型
record Cursor (M X : Set) : Set where
constructor _<[_]>_
field
beforeMe : Bwd X
atMe : M
afterMe : List X
within ((\ x -> x))
turn inputBuffer
into outputBuffer
because {refl}
InputBuffer
和OutputBuffer
已被替换,以阻止可能进入和剽窃的其他学生。 Bwd
是一个简单的snoc列表:
data Bwd (X : Set) : Set where
[] : Bwd X
_<:_ : Bwd X -> X -> Bwd X
就像我说的,这是一项大学任务,所以我不能提供更多,希望你理解。