在我的理論中,我有一些更大的定義,從中我使用引理推導出一些簡單的屬性。條件重寫規則與未知條件
我的問題是,用於派生屬性的引理沒有被簡化器使用,我必須手動實例化它們。有沒有辦法讓這個更自動化?
的最小例子如下所示:
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'。因此它會嘗試再次使用相同的條件重寫規則,直到達到簡化深度限制並且簡化器中止整個條件重寫鏈(在簡化器中沒有回溯)。 –