你可以讓汽車工具給你一個很大的開端。我需要做更多的工作來告訴你從汽車工具獲得反饋的多種方式,而不是用我來證明這個定理。
datatype bc_t = B | C
lemma "∀ x::bc_t . (x = B ⟶ x ~= C)"
try0
using[[simp_trace]]
using [[simp_trace_depth_limit=100]]
apply(simp)
done
lemma "∀ x::bc_t . (x = B ⟶ x ~= C)"
sledgehammer
by (metis bc_t.distinct(1))
我以前,因爲我曾在 「插件選項/伊莎貝爾/常規」 選中Auto Methods
。很多時候在選項中,除了大錘之外,我還檢查了所有的汽車工具箱。
您可以使用sledgehammer
,因爲我在那裏顯示,或者您可以在PIDE的Sledgehammer面板中使用它。用simp_trace
,當您將光標放在apply(simp)
的行上時,您可以瞭解simp
方法如何證明該方法,該方法將基於替換規則。
更新140108_1305
自動工具是幫助我們快速的工作很重要,但它也是非常重要的,有時理解證明的基本邏輯。這是simp_trace
和simp
方法的其他屬性可能有用的地方。請閱讀tutorial.pdf
,prog-prove.pdf
和isar-ref.pdf
瞭解關於使用simp
的一些細節和課程。
用於控制simp
方法的三個這樣的屬性是add
,del
和only
。
在您的示例中,我想使用simp_trace
以及only
來明確使用哪些規則,或許可以幫助我理解邏輯。
Sledgehammer的metis
證明顯示simp
可能只使用一些規則。我看着simp
跟蹤,並讓simp
只使用我可以從控制面板剪切和粘貼的規則。我計算了4條有名的規則,這實際上並不會成爲值得做的事情,儘管我必須找出答案。
[更新 140101_0745:儘量不超過分析形勢,我結束了使用del
因爲我使用only
的宏偉計劃是行不通的。用simp only
代替simp del
,apply
方法失敗並顯示錯誤,這意味着它不能僅用這四條規則簡化目標。 auto simp only
而不是simp only
。該auto
方法是不是在路上simp
是有限的,它可以做很多事也不會告訴你,如調用blast
]
lemma "∀ x::bc_t . (x = B ⟶ x ~= C)"
using[[simp_trace]]
using [[simp_trace_depth_limit=100]]
apply(simp del:
bc_t.distinct(1)
simp_thms(8)
simp_thms(17)
simp_thms(35)
)
oops
好了,現在當我在看最新的simp
跟蹤,還有一堆simp
規則。簡化器有一個以上的石頭來殺死這隻鳥,所以我放棄了。
要記住的一件事是,您可以使用simp
與方法如auto
和fastforce
,如apply(auto simp add: stufferThm)
。特別是如果auto
,如果simp
規則不足以證明一個定理,它可能會訴諸使用blast
,它不會顯示在simp
跟蹤。在使用only
時,知道這一點非常重要,因此您不會對auto
找到的證明所需的全部規則感到滿意。
這裏我對你的評論發表一些評論。如Eberl提到的那樣,如果simp
保持紫色很長時間,則必須進行大量簡化,或者它處於非終止循環中。要麼是壞的。我不認爲40秒simp
證明了一個很好的證據。
基本上,很容易讓simp
進入循環,或者任何其他調用simp
的方法,尤其是如果您要定義自己的simp
規則。當它工作時,simp
方法很容易。如果沒有,你可能需要爲你的邏輯工作。
使用,當沒有證據被發現,它會給你的自動證明方法的列表進行實驗,像force
,fastforce
,auto
等。如果simp
與auto
循環,您可能會fastforce
嘗試。試驗很重要。
要記住的另一件重要事情是展開不是simp
規則的定義。大錘有時可以找到定義,但有時最簡單的定理無法證明,因爲定義尚未展開。
[更新 140109_0750:進行概括總是有風險的。展開定義將多次阻止大錘找到證據。通過匹配高級定理,Sledgehammer可以很好地工作,所以一個絕望的擴展公式會多次失敗。即使是一個巨大的擴展公式也會導致其他自動方法無法找到證明。然而,對於基於方程的計算性質的事物,擴展定義可以允許完全減少巨大的,複雜的表達式。你必須知道什麼時候握住他們,什麼時候展開他們。偉大的事情是很容易以合理的速度嘗試很多事情。]
definition stuffTrue :: "bool" where
"stuffTrue = True"
theorem "stuffTrue"
apply(unfold stuffTrue_def)
by(simp)
這不是小問題。簡單的事情不一定很容易證明。一旦你學會了如何使用汽車工具,所需要的打字就是微不足道的。
我得到了吹噓權利回答了第100個問題標記爲「伊莎貝爾」。這種吹牛很重要,因爲談到自我撫摸時,伊莎貝爾人羣是殘酷的。他們不會給你任何自我撫慰贈品。 – 2014-01-08 14:19:51
請忽略最後的評論,除了技術垃圾說話的廢話的情況下。 – 2014-01-08 14:26:11
謝謝!非常抱歉,一個微不足道的問題。當我在一個新的.thy文件中複製你的答案時,它就起作用了。然而,在我的長文件中,我正在試驗這個引理既不是「簡單」也不是「自動」的工作(「try0 apply(simp)」在jEdit中突出顯示爲紫色,沒有特定的錯誤信息)。也許我有一些名字衝突,但還沒有看到它。再次感謝! – user3173484