有什么策略可以证明这个看似简单的目标?

时间:2019-04-12 16:24:09

标签: coq

我有以下目标:

1个子目标

______________________________________(1/1)

(如果(a =?a)%string || false,然后#a :: nil else nil)= nil

因为显然a = a,所以我想知道为什么策略“ simpl”不起作用。

1 个答案:

答案 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