[英]Isabelle: how to print result of 1 + 2?
這是一個初學者的問題。
我正在閱讀教程“在Isabelle / HOL中編程和證明”。
我想打印“1 + 2”的結果。
所以我寫道:
value "1 + 2"
這使:
"1 + (1 + 1)"
:: "'a"
我想看看結果,即“3”。 我怎么能在伊莎貝爾那里做到這一點? 如果我在定理證明器中標准化“1 + 2”,則顯示結果3。 我只想在伊莎貝爾做同樣的事情。
請注意,我昨天開始使用Isabelle。
在伊莎貝爾,整數常量(也稱為數字常數 )等..., -2
, -1
, 0
, 1
, 2
,...的過載。
存在零( zero
),一( one
),正數( numeral
)和負數( neg_numeral
)的類型類。 后兩者還包含添加劑半semigroup_add
類型類( group_add
) - 允許使用+
- 和添加劑組( group_add
) - 允許使用+
和-
(也是一元) - 分別使用。 (另請注意,加號本身( op +
)在類plus
重載。)
現在,如果你輸入一個表達式,Isabelle推斷出最常見的類型。 通常這比一般人預期的要普遍。 這正是你遇到的。 考慮一些例子:
input inferred type type class
0 'a 'a::zero
1 'a 'a::one
op + 'a => 'a => 'a 'a::plus
1 + 2 'a 'a::numeral
x + y 'a 'a::plus
Suc 0 + y nat (nat is an instance, among others,
of class semigroup_add)
在這種情況下,您可以通過顯式添加類型約束來告訴系統您的意思是較不通用的類型,例如, (1::nat) + 2
導致整體類型nat
。
如果您使用Isabelle / jEdit,您可以方便地調查此類情況,而不會在理論中引入declare [[...]]
類的噪聲。 例如進入時
value "1 + 2"
在您看到的輸出面板中
"1 + (1 + 1)"
:: "'a"
現在,您可以在輸出中的'a
上按Ctrl鍵(即按住控制按鈕並單擊鼠標)。 這將告訴你'a
是在班級numeral
。 您可以進一步按Ctrl鍵單擊numeral
以獲得此類型類的定義。
如果您將輸入更改為(對於自然數字)
value "(1::nat) + 2"
或(對於整數)
value "(1::int) + 2"
輸出將是
"Suc (Suc (Suc 0)))" :: "nat"
和
"3" :: "int"
正如所料。
更新:請注意,自然數字(類型nat
)將以一元表示形式打印,如: 0
, Suc 0
, Suc (Suc 0)
,.... 但是,這不應與1 + (1 + (1 + ...))
混淆(它是任意類型的numeral
)。 這種“Peano數字”構成了適當的自然數,就好像nat
定義如下:
datatype nat = 0 | Suc nat
所以這僅僅是關於漂亮印刷,但邏輯上無關緊要。
這是我的問題。 一個初學者到另一個,多么幸運。
我不知道所有的細節,但是當你沒有為常量1和2指定類型時,那么你正在使用一個numeral
,這個numeral
都是在Num.thy中定義的 。
試試這個並查看輸出面板:
declare[[show_consts=true]]
declare[[show_types=true]]
declare[[show_sorts=true]]
value "1 + 2"
value "1 + (2::nat)"
theorem "1 + 2 = z"
apply simp
oops
您會看到1+2
是numeral
,並且不會自動簡化,或者更確切地說,通過擴展為“后繼”形式的添加來簡化過多。
value "1 + (2::nat)"
確實被簡化為“首選人形”。
在simp
之后, 1 + 2
確實被簡化為“首選形式”,即使它是numeral
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.