我有以下目标:
1个子目标
______________________________________(1/1)
(如果(a =?a)%string || false,然后#a :: nil else nil)= nil
因为显然a = a,所以我想知道为什么策略“ simpl”不起作用。
答案 0 :(得分:2)
Print "=?".
String.eqb =
fix eqb (s1 s2 : string) {struct s1} : bool :=
match s1 with
| "" => match s2 with
| "" => true
| String _ _ => false
end
| String c1 s1' =>
match s2 with
| "" => false
| String c2 s2' => if Ascii.eqb c1 c2 then eqb s1' s2' else false
end
end
: string -> string -> bool
String.eqb
被定义为fix
,这意味着如果Coq看不到该参数的开头符号(构造函数),则Coq不会将其应用于参数。在这种情况下,simpl
策略无法应用String.eqb a a
,因为a
是变量,我们对其“形状”一无所知-因此您一无所获。
顺便说一下,||
,即orb
函数是通过其第一个参数的模式匹配来定义的,因此simpl
无法将(a =? a)%string || false
减少为(a =? a)%string
一种解决方法是用String.eqb_refl
引理重写,使用完该引理后,很明显,除非您在上下文中有矛盾,否则目标是不可证明的,在这种情况下,您实际上并没有需要String.eqb_refl
。