Mercurial > hg > Members > kono > Proof > automaton
view automaton-in-agda/src/puzzle.agda @ 330:407684f806e4
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 16 Nov 2022 17:43:10 +0900 |
parents | 3fa72793620b |
children |
line wrap: on
line source
module puzzle where ---- 仮定 -- 猫か犬を飼っている人は山羊を飼ってない -- 猫を飼ってない人は、犬かウサギを飼っている -- 猫も山羊も飼っていない人は、ウサギを飼っている -- ---- 問題 -- 山羊を飼っている人は、犬を飼っていない -- 山羊を飼っている人は、ウサギを飼っている -- ウサギを飼っていない人は、猫を飼っている module pet-research where open import logic open import Relation.Nullary open import Data.Empty postulate -- the law of exclude middle lem : (a : Set) → a ∨ ( ¬ a ) record PetResearch ( Cat Dog Goat Rabbit : Set ) : Set where field fact1 : Cat ∨ Dog → ¬ Goat fact2 : ¬ Cat → Dog ∨ Rabbit fact3 : ¬ ( Cat ∨ Goat ) → Rabbit module tmp ( Cat Dog Goat Rabbit : Set ) (p : PetResearch Cat Dog Goat Rabbit ) where open PetResearch problem0 : Cat ∨ Dog ∨ Goat ∨ Rabbit problem0 with lem Cat | lem Goat ... | case1 c | g = case1 c ... | case2 ¬c | case1 g = case2 ( case2 ( case1 g ) ) ... | case2 ¬c | case2 ¬g = case2 ( case2 ( case2 ( fact3 p lemma1 ))) where lemma1 : ¬ ( Cat ∨ Goat ) lemma1 (case1 c) = ¬c c lemma1 (case2 g) = ¬g g problem1 : Goat → ¬ Dog problem1 g d = fact1 p (case2 d) g problem2 : Goat → Rabbit problem2 g with lem Cat | lem Dog problem2 g | case1 c | d = ⊥-elim ( fact1 p (case1 c ) g ) problem2 g | case2 ¬c | case1 d = ⊥-elim ( fact1 p (case2 d ) g ) problem2 g | case2 ¬c | case2 ¬d with lem Rabbit ... | case1 r = r ... | case2 ¬r = fact3 p lemma2 where lemma2 : ¬ ( Cat ∨ Goat ) lemma2 (case1 c) = ¬c c lemma2 (case2 g) with fact2 p ¬c lemma2 (case2 g) | case1 d = ¬d d lemma2 (case2 g) | case2 r = ¬r r problem3 : (¬ Rabbit ) → Cat problem3 ¬r with lem Cat | lem Goat problem3 ¬r | case1 c | g = c problem3 ¬r | case2 ¬c | g = ⊥-elim ( ¬r ( fact3 p lemma3 )) where lemma3 : ¬ ( Cat ∨ Goat ) lemma3 (case1 c) = ¬c c lemma3 (case2 g) with fact2 p ¬c lemma3 (case2 g) | case1 d = fact1 p (case2 d ) g lemma3 (case2 g) | case2 r = ¬r r module pet-research1 ( Cat Dog Goat Rabbit : Set ) where open import Data.Bool open import Relation.Binary open import Relation.Binary.PropositionalEquality _=>_ : Bool → Bool → Bool _ => true = true false => false = true true => false = false ¬_ : Bool → Bool ¬ p = not p problem0 : ( Cat Dog Goat Rabbit : Bool ) → ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) => (Cat ∨ Dog ∨ Goat ∨ Rabbit) ≡ true problem0 true d g r = refl problem0 false true g r = refl problem0 false false true r = refl problem0 false false false true = refl problem0 false false false false = refl problem1 : ( Cat Dog Goat Rabbit : Bool ) → ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) => ( Goat => ( ¬ Dog )) ≡ true problem1 c false false r = refl problem1 c true false r = refl problem1 c false true r = refl problem1 false true true r = refl problem1 true true true r = refl problem2 : ( Cat Dog Goat Rabbit : Bool ) → ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) => ( Goat => Rabbit ) ≡ true problem2 c d false false = refl problem2 c d false true = refl problem2 c d true true = refl problem2 true d true false = refl problem2 false false true false = refl problem2 false true true false = refl problem3 : ( Cat Dog Goat Rabbit : Bool ) → ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) => ( (¬ Rabbit ) => Cat ) ≡ true problem3 false d g true = refl problem3 true d g true = refl problem3 true d g false = refl problem3 false false false false = refl problem3 false false true false = refl problem3 false true false false = refl problem3 false true true false = refl -- module pet-research2 ( Cat Dog Goat Rabbit : Set ) where -- -- open import Data.Bool hiding ( _∨_ ) -- open import Relation.Binary -- open import Relation.Binary.PropositionalEquality -- -- ¬_ : Bool → Bool -- ¬ p = p xor true -- -- infixr 5 _∨_ -- _∨_ : Bool → Bool → Bool -- a ∨ b = ¬ ( (¬ a) ∧ (¬ b ) ) -- -- _=>_ : Bool → Bool → Bool -- a => b = (¬ a ) ∨ b -- -- open import Data.Bool.Solver using (module xor-∧-Solver) -- open xor-∧-Solver -- -- problem0' : ( Cat : Bool ) → (Cat xor Cat ) ≡ false -- problem0' = solve 1 (λ c → (c :+ c ) := con false ) refl -- -- problem1' : ( Cat : Bool ) → (Cat ∧ (Cat xor true )) ≡ false -- problem1' = solve 1 (λ c → ((c :* (c :+ con true )) ) := con false ) {!!} -- -- open import Data.Nat -- :¬_ : {n : ℕ} → Polynomial n → Polynomial n -- :¬ p = p :+ con true -- -- _:∨_ : {n : ℕ} → Polynomial n → Polynomial n → Polynomial n -- a :∨ b = :¬ ( ( :¬ a ) :* ( :¬ b )) -- -- _:=>_ : {n : ℕ} → Polynomial n → Polynomial n → Polynomial n -- a :=> b = ( :¬ a ) :∨ b -- -- _:∧_ = _:*_ -- -- infixr 6 _:∧_ -- infixr 5 _:∨_ -- -- problem0 : ( Cat Dog Goat Rabbit : Bool ) → -- ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) -- => (Cat ∨ Dog ∨ Goat ∨ Rabbit) ≡ true -- problem0 = solve 4 ( λ Cat Dog Goat Rabbit → ( -- ( ((Cat :∨ Dog ) :=> (:¬ Goat)) :∧ ( ((:¬ Cat ) :=> ( Dog :∨ Rabbit )) :∧ (( :¬ ( Cat :∨ Goat ) ) :=> Rabbit) )) -- :=> ( Cat :∨ (Dog :∨ ( Goat :∨ Rabbit))) ) := con true ) {!!} -- -- problem1 : ( Cat Dog Goat Rabbit : Bool ) → -- ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) -- => ( Goat => ( ¬ Dog )) ≡ true -- problem1 c false false r = {!!} -- problem1 c true false r = {!!} -- problem1 c false true r = {!!} -- problem1 false true true r = refl -- problem1 true true true r = refl -- -- problem2 : ( Cat Dog Goat Rabbit : Bool ) → -- ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) -- => ( Goat => Rabbit ) ≡ true -- problem2 c d false false = {!!} -- problem2 c d false true = {!!} -- problem2 c d true true = {!!} -- problem2 true d true false = refl -- problem2 false false true false = refl -- problem2 false true true false = refl -- -- problem3 : ( Cat Dog Goat Rabbit : Bool ) → -- ((( Cat ∨ Dog ) => (¬ Goat) ) ∧ ( (¬ Cat ) => ( Dog ∨ Rabbit ) ) ∧ ( ( ¬ ( Cat ∨ Goat ) ) => Rabbit ) ) -- => ( (¬ Rabbit ) => Cat ) ≡ true -- problem3 false d g true = {!!} -- problem3 true d g true = {!!} -- problem3 true d g false = {!!} -- problem3 false false false false = refl -- problem3 false false true false = refl -- problem3 false true false false = refl -- problem3 false true true false = refl