{-# OPTIONS --cubical-compatible #-}
module Padova2025-zh-TW.ProvingBasics.Equality.Booleans where
關於布林值的結果#
open import Padova2025-zh-TW.ProgrammingBasics.Booleans
open import Padova2025-zh-TW.ProgrammingBasics.Operators
open import Padova2025-zh-TW.ProvingBasics.Negation
open import Padova2025-zh-TW.ProvingBasics.Equality.Base
open import Padova2025-zh-TW.ProvingBasics.Equality.General
習題:False 不是 true#
習題 1
false≢truefalse≢true : false ≢ true
false≢true = {!!}
你的解答
參考解答
false≢true : false ≢ true
false≢true ()
習題:雙重否定#
習題 2
not²not² : (x : Bool) → not (not x) ≡ x
not² = {!!}
你的解答
習題:邏輯 AND 的交換律#
習題 3
&&-comm&&-comm : (x y : Bool) → (x && y) ≡ (y && x)
&&-comm = {!!}
你的解答
重言式#
先前我們討論過一個函數
is-tautology₁ : (Bool → Bool) → Bool,目的是當且僅當第一個引數恆為 true 時回傳 true。
一個直截了當的實作如下:
is-tautology₁ : (Bool → Bool) → Bool
is-tautology₁ f = f false && f true
然而,也可以有一個更費解的實作。
is-tautology₁' : (Bool → Bool) → Bool
is-tautology₁' f = f (f false)
讓我們驗證這個替代實作也運作正確。為此,我們先形式化「一個函數恆為 true」是什麼意思:
ConstantlyTrue : (Bool → Bool) → Set
ConstantlyTrue f = (x : Bool) → f x ≡ true
換句話說,型別 ConstantlyTrue f 的元素,是一個把每個輸入 x : Bool 映射到 f x ≡ true 的見證的函數。
接著我們就可以陳述並證明:若 f 恆為真,is-tautology₁' f 會正確地回傳 true:
習題 4
part₁part₁ : (f : Bool → Bool) → ConstantlyTrue f → is-tautology₁' f ≡ true
part₁ = {!!}
參考解答用到: false
你的解答
參考解答
part₁ : (f : Bool → Bool) → ConstantlyTrue f → is-tautology₁' f ≡ true
part₁ f p = p (f false)
反方向比較複雜。組織這個論證的一種方式,是先驗證一個輔助引理。
習題 5
γγ : (f : Bool → Bool) → (a : Bool) → f false ≡ a → f a ≡ true → ConstantlyTrue f
γ = {!!}
你的解答
習題 6
part₂part₂ : (f : Bool → Bool) → is-tautology₁' f ≡ true → ConstantlyTrue f
part₂ f = {!!}
你的解答
參考解答
part₂ : (f : Bool → Bool) → is-tautology₁' f ≡ true → ConstantlyTrue f
part₂ f = γ f (f false) refl
這種組織論證的方式要歸功於 Martín Escardó,他曾 非常詳盡地探討過這個主題。