2016-09-06 74 views
6

有沒有辦法一次簡化一個步驟?coq一步一步簡化?

假設有f1 (f2 x)兩者均可以依次經由單個simpl被簡化,是有可能簡化f2 x作爲第一步,檢查中間結果然後簡化f1

就拿定理:

Theorem pred_length : forall n : nat, forall l : list nat, 
    pred (length (n :: l)) = length l. 
Proof. 
    intros. 
    simpl. 
    reflexivity. 
Qed. 

simpl戰術簡化Nat.pred (length (n :: l))length l。有沒有辦法打破這種成兩步簡化即:

Nat.pred (length (n :: l)) --> Nat.pred (S (length l)) --> length l 
+0

A [mcve]會不錯...而且最後的「單詞」不應該是「f1」嗎? –

+0

謝謝你指出。編輯。 –

回答

7

您還可以將simpl用於特定模式。

Theorem pred_length : forall n : nat, forall l : list nat, 
    pred (length (n :: l)) = length l. 
Proof. 
intros. 
simpl length. 
simpl pred. 
reflexivity. 
Qed. 

如果你有像length的圖案,可以被簡化的重複出現,則可以通過給予該發生的位置(從左至右),例如進一步限制簡化的結果simpl length at 1simpl length at 2第一次或第二次出現。

3

我們可以把簡化爲pred關,簡化它的參數,並重新打開它:

Theorem pred_length : forall n : nat, forall l : list nat, 
    pred (length (n :: l)) = length l. 
Proof. 
    intros. 
    Arguments pred : simpl never. (* do not unfold pred *) 
    simpl. 
    Arguments pred : simpl nomatch. (* unfold if extra simplification is possible *) 
    simpl. 
    reflexivity. 
Qed. 

請參見參考的§8.7.4手冊瞭解更多詳情。

+1

@Savvas Savvides感謝您接受我的回答,但請允許我*恭敬地*建議您不要太早接受答案,因爲這可能會阻止某些用戶提供他們自己的高質量答案,這是我們都感興趣的。等待至少24小時。祝你有個美好的一天,祝你好運:) –