2016-10-14 202 views
0

我的定義my_def1鑄造類型

Require Import compcert.common.Memory. 
Require Import compcert.common.Values. 
Require Import compcert.lib.Integers. 

Definition my_def1 (vl: list memval) : val := 
match proj_bytes vl with 
    | Some bl => Vint(Int.sign_ext 16 (Int.repr (decode_int bl))) 
    | None => Vundef 
end. 

我還想寫另一個定義my_def2類似my_def1像下面添加一個公理proj_bytes vl總是返回Some bl,所以:

Definition my_def2 (vl: list memval) : val := 
    Vint(Int.sign_ext 16 (Int.repr (decode_int ((*?*))))) 
end. 

我的問題是我怎樣才能完成my_def2並編寫相關axiomproj_bytes vl

或者問題是我如何從類型list memval轉換爲list byte [decode_int接受list byte]

這裏是memval定義:

Inductive memval : Type := 
    Undef : memval 
| Byte : byte -> memval 
| Fragment : val -> quantity -> nat -> memval 

回答

2

你有兩種做法,讓我們先要做一些準備工作:

Variable (memval byte : Type). 
Variable (proj_bytes : list memval -> option byte). 

Inductive val := Vundef | VInt : byte -> val. 

Definition my_def1 (vl: list memval) : val := 
match proj_bytes vl with 
    | Some bl => VInt bl 
    | None => Vundef 
end. 

然後,你可以定義你的公理:

Axiom pb1 : forall vl , { v | proj_bytes vl = Some v }. 

你破壞了這個公理並用內心平等。但是,你可以猜測這種方法有點不方便。

這可能是最好假裝有一個默認值進行破壞proj_bytes:

Variable (byte_def : byte). 

Definition bsel vl := 
    match proj_bytes vl with 
    | Some bl => bl 
    | None => byte_def 
    end. 

Definition my_def2 (vl: list memval) : val := VInt (bsel vl). 

Lemma my_defP vl : my_def1 vl = my_def2 vl. 
Proof. 
now destruct (pb1 vl) as [b H]; unfold my_def1, my_def2, bsel; rewrite H. 
Qed. 

然而,沒有上述方法會給你一個證明巨大的進步,因此,真正的問題是你的原目的是。

+0

謝謝。關於這個公理,我試圖把它寫成'Axiom pb1:forall vl,proj_bytes vl = Some v.' which does not recognized v。你能解釋一下它的邏輯嗎? –

+0

我的意思是你寫的那個邏輯。 –

+0

'{v | P}'表示存在一些'v',使得'P'成立。你也可以更好一些,因爲指定一些公理'not_undefined vl'來排除不希望的情況,然後通過案例分析進行處理。 – ejgallego