在我的理论中,我有一些更大的定义,从中我使用引理推导出一些简单的属性。条件重写规则与未知条件
我的问题是,用于派生属性的引理没有被简化器使用,我必须手动实例化它们。有没有办法让这个更自动化?
的最小例子如下所示:
definition complexFact :: "int ⇒ int ⇒ int ⇒ bool" where
"complexFact x y z ≡ x = y + z"
lemma useComplexFact: "complexFact x y z ⟹ x = y + z"
by (simp add: complexFact_def)
lemma example_1:
assumes cf: "complexFact a b c"
shows "a = b + c"
apply (simp add: cf useComplexFact) (* easy, works *)
done
lemma example_2a:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: cf useComplexFact) (* does not work *)
oops
lemma example_2b:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (simp add: useComplexFact[OF cf]) (* works *)
done
lemma example_2c:
assumes cf: "complexFact a b c"
shows "a - b = c"
apply (subst useComplexFact) (* manually it also works*)
apply (subst cf)
apply simp+
done
我发现在参考手册中的下段,所以我想我可以解决我的问题与自定义解算器。 但是,我从来没有真正触及伊莎贝尔的内部ML部分,也不知道从哪里开始。
重写不实例化未知数。例如,单独重写 不能证明是一个ε?A,因为这需要实例化?A。然而,求解器是一种随意的策略,可以根据需要实例化未知数 。这是Simplifier处理 条件包含额外变量的条件重写规则的唯一方法。
谢谢。为什么假设求解器在下面的例子2中不起作用:'使用cf apply(simp add:useComplexFact [where x = a])''。我使左侧不变,simp_trace显示'[0]添加重写规则“??。unknown”: complexFact a?y1?z1?a??y1 +?z1'。然而,假设求解器没有实例化未知数? – peq
'simp add:useComplexFact [where x = a]'不起作用,所得到的重写规则是'complexFact a?y?z ==> a =?y +?z'。所以当简化器看到一个'a'并试图在其上使用这个规则时,它必须解决'complexFact a?y?z'的条件。由于简化器在任何解算器之前首先调用它自己,它试图处理这个条件,并且它包含一个'a'。因此它会尝试再次使用相同的条件重写规则,直到达到简化深度限制并且简化器中止整个条件重写链(在简化器中没有回溯)。 –