BC4a: Logika klasyczna [TODO]



Aksjomaty i prawa logiki klasycznej (TODO)

TODO:

Definition DNE : Prop :=
  forall P : Prop, ~ ~ P -> P.

Definition LEM : Prop :=
  forall P : Prop, P \/ ~ P.

Definition CM : Prop :=
  forall P : Prop, (~ P -> P) -> P.

Definition Peirce : Prop :=
  forall P Q : Prop, ((P -> Q) -> P) -> P.

Definition Contra : Prop :=
  forall P Q : Prop, (~ Q -> ~ P) -> (P -> Q).

Definition MI : Prop :=
  forall P Q : Prop, (P -> Q) -> ~ P \/ Q.

Definition ME : Prop :=
  forall P Q : Prop, (P <-> Q) -> (P /\ Q) \/ (~ P /\ ~ Q).

Definition or_wor : Prop :=
  forall P Q : Prop, (~ P -> Q) -> P \/ Q.

Definition and_wand : Prop :=
  forall P Q : Prop, ~ (~ P \/ ~ Q) -> P /\ Q.

Definition snimpl_nimpl : Prop :=
  forall P Q : Prop, ~ (P -> Q) -> (P /\ ~ Q).

Definition xor_wxor : Prop :=
  forall P Q : Prop, ~ (P <-> Q) -> xor P Q.

Ltac u :=
  unfold DNE, LEM, CM, Peirce, Contra, MI, ME, or_wor, and_wand, snimpl_nimpl, xor_wxor.

Logika klasyczna jako logika diabła (TODO)

Dawno dawno temu w odległej galaktyce, a konkretniej w ZSRR, był sobie pewien rusek. Pewnego razu do ruska przyszedł diaboł (a diaboł to, jak wiadomo, coś dużo gorszego niż diabeł) i zaoferował mu taki oto deal: "dam ci miliard dolarów lub jeżeli dasz mi miliard dolarów, to spełnię dowolne twoje życzenie".
Rusek trochę skonsternowany, nie bardzo widzi mu się podpisywanie cyrografu krwią. "Nie nie, żadnych cyrografów, ani innych takich kruczków prawnych", zapewnia go diaboł. Rusek myśli sobie tak: "pewnie hajsu nie dostanę, ale przecież nic nie tracę", po czym mówi: "No dobra, bierę".
"Świetnie!" - mówi diaboł - "Jeżeli dasz mi miliard dolarów, to spełnie dowolne twoje życzenie". Cóż, rusek był zawiedziony, ale nie zaskoczony - przecież dokładnie tego się spodziewał. Niedługo później diaboł zniknął, a rusek wrócił do pracy w kołchozie.
Jako, że był przodownikiem pracy i to na dodatek bardzo oszczędnym, bo nie miał dzieci ani baby, szybko udało mu się odłożyć miliard dolarów i jeszcze kilka rubli na walizkę, coby mieć gdzie trzymać dolary. Wtedy znów pojawił się diaboł.
"O, cóż za spotkanie. Trzym hajs i spełnij moje życzenie, tak jak się umawialiśmy" - powiedział rusek i podał diabołowi walizkę. "Wisz co" - odpowiedział mu diaboł - "zmieniłem zdanie. Życzenia nie spełnię, ale za to dam ci miliard dolarów. Łapaj" - i diaboł oddał ruskowi walizkę.
Jaki morał płynie z tej bajki? Diaboł to bydle złe i przeokrutne, gdyż w logice, którą posługuje się przy robieniu dealów (względnie podpisywaniu cyrografów) obowiązuje prawo eliminacji podwójnej negacji.
Prawo to prezentuje się podobnie jak prawo wyłączonego środka:

Lemma DNE_hard :
  forall P : Prop, ~ ~ P -> P.
Proof.
  intros P nnp.
Abort.

Po pierwsze, nie da się go konstruktywnie udowodnić.

Lemma Irrefutable_DNE :
  forall P : Prop, ~ ~ (~ ~ P -> P).
Proof.
  intros P H.
  apply H.
  intro nnp.
  cut False.
    contradiction.
    apply nnp. intro p. apply H. intros _. assumption.
Qed.

Po drugie, jest ono niezaprzeczalne.
Po trzecie, jest równoważne prawu wyłączonego środka.

Lemma DNE_LEM :
  DNE -> LEM.

Lemma DNE_MI :
  DNE -> MI.

Lemma DNE_ME :
  DNE -> ME.

Lemma DNE_CM :
  DNE -> CM.

Lemma DNE_Peirce :
  DNE -> Peirce.

Lemma DNE_Contra :
  DNE -> Contra.

Logika zdań stabilnych

P jest stabilne, gdy ~ ~ P -> P

Definition Stable (P : Prop) : Prop :=
  ~ ~ P -> P.

Lemma Stable_True :
  Stable True.

Lemma Stable_False :
  Stable False.

Lemma Stable_and :
  forall P Q : Prop,
    Stable P -> Stable Q -> Stable (P /\ Q).

Lemma Stable_or_fail :
  forall P Q : Prop,
    Stable P -> Stable Q -> Stable (P \/ Q).
Proof.
  unfold Stable.
  intros P Q f g nnpq.
  left.
  apply f; intros p.
  apply nnpq.
  intros [p' | q].
  - contradiction.
  -
Abort.

Lemma Stable_impl :
  forall P Q : Prop,
    Stable Q -> Stable (P -> Q).

Lemma Stable_forall :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Stable (P x)) -> Stable (forall x : A, P x).

Lemma Stable_exists :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Stable (P x)) -> Stable (exists x : A, P x).
Proof.
  unfold Stable.
  intros A P Hnnp nnex.
Abort.

Lemma not_not_elim :
  forall P Q : Prop,
    (~ ~ Q -> Q) -> (P -> Q) -> ~ ~ P -> Q.

Logika klasyczna jako logika Boga (TODO)


Lemma LEM_hard :
  forall P : Prop, P \/ ~ P.
Proof.
  intro P. left.
Restart.
  intro P. right. intro p.
Abort.

Lemma Irrefutable_LEM :
  forall P : Prop, ~ ~ (P \/ ~ P).
Proof.
  intros P H.
  apply H. right. intro p.
  apply H. left. assumption.
Qed.

Lemma LEM_DNE :
  (forall P : Prop, P \/ ~ P) ->
    (forall P : Prop, ~ ~ P -> P).

Lemma LEM_MI :
  (forall P : Prop, P \/ ~ P) ->
    (forall P Q : Prop, (P -> Q) -> ~ P \/ Q).

Lemma LEM_ME :
  (forall P : Prop, P \/ ~ P) ->
    (forall P Q : Prop, (P <-> Q) -> (P /\ Q) \/ (~ P /\ ~ Q)).

Lemma LEM_Peirce :
  (forall P : Prop, P \/ ~ P) ->
    (forall P Q : Prop, ((P -> Q) -> P) -> P).

Lemma LEM_CM :
  (forall P : Prop, P \/ ~ P) ->
    (forall P : Prop, (~ P -> P) -> P).

Lemma LEM_Contra :
  (forall P : Prop, P \/ ~ P) ->
    (forall P Q : Prop, (~ Q -> ~ P) -> (P -> Q)).

Zdania określone


Definition Definite (P : Prop) : Prop :=
  P \/ ~ P.

Lemma Definite_True :
  Definite True.

Lemma Definite_False :
  Definite False.

Lemma Definite_impl :
  forall P Q : Prop,
    Definite P -> Definite Q -> Definite (P -> Q).

Lemma Definite_or :
  forall P Q : Prop,
    Definite P -> Definite Q -> Definite (P \/ Q).

Lemma Definite_and :
  forall P Q : Prop,
    Definite P -> Definite Q -> Definite (P /\ Q).

Lemma Definite_iff :
  forall P Q : Prop,
    Definite P -> Definite Q -> Definite (P <-> Q).

Lemma Definite_not :
  forall P : Prop,
    Definite P -> Definite (~ P).

Lemma Definite_forall_failed :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Definite (P x)) -> Definite (forall x : A, P x).
Proof.
  unfold Definite.
  intros A P HD.
Abort.

Lemma Definite_exists_failed :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Definite (P x)) -> Definite (exists x : A, P x).
Proof.
  unfold Definite.
  intros A P HD.
Abort.

Metoda zerojedynkowa (TODO)

Tutaj o rysowaniu tabelek.

Logika klasyczna jako logika kontrapozycji


Lemma contraposition' :
  forall P Q : Prop, (~ Q -> ~ P) -> (P -> Q).
Proof.
  intros P Q H p.
Abort.

Lemma Irrefutable_Contra :
  forall P Q : Prop, ~ ~ ((~ Q -> ~ P) -> (P -> Q)).
Proof.
  intros P Q H. apply H.
  intros nqnp p. cut False.
    contradiction.
    apply nqnp.
      intro. apply H. intros _ _. assumption.
      assumption.
Qed.

Lemma Contra_LEM :
  Contra -> LEM.

Lemma Contra_MI :
  Contra -> MI.

Lemma Contra_ME :
  Contra -> ME.

Lemma Contra_DNE :
  Contra -> DNE.

Lemma Contra_CM :
  Contra -> CM.

Lemma Contra_Peirce :
  Contra -> Peirce.

Zdania kontrapozowalne dziedzinowo (TODO)


Definition DomainContraposable (P : Prop) : Prop :=
  forall R : Prop, (~ R -> ~ P) -> (P -> R).

Lemma DomainContraposable_True_fail :
  DomainContraposable True.
Proof.
  unfold DomainContraposable.
  intros R nt _.
Abort.

Lemma DomainContraposable_False :
  DomainContraposable False.

Lemma DomainContraposable_impl_fail :
  forall P Q : Prop,
    DomainContraposable P -> DomainContraposable Q -> DomainContraposable (P -> Q).
Proof.
  unfold DomainContraposable.
  intros P Q HP HQ R npq pq.
  apply HP. tauto.
Abort.

Lemma DomainContraposable_or :
  forall P Q : Prop,
    DomainContraposable P -> DomainContraposable Q -> DomainContraposable (P \/ Q).

Lemma DomainContraposable_and :
  forall P Q : Prop,
    DomainContraposable P -> DomainContraposable Q -> DomainContraposable (P /\ Q).

Lemma DomainContraposable_iff_fail :
  forall P Q : Prop,
    DomainContraposable P -> DomainContraposable Q -> DomainContraposable (P <-> Q).
Proof.
  unfold DomainContraposable.
  intros P Q pr qr R H [pq qp]. apply pr.
  - intros nr _. apply H; [| split]; assumption.
  -
Abort.

Lemma DomainContraposable_not_fail :
  forall P : Prop,
    DomainContraposable P -> DomainContraposable (~ P).
Proof.
  unfold DomainContraposable.
  intros P pr R nnp np.
  apply pr.
  - intros _. assumption.
  -
Abort.

Lemma DomainContraposable_forall_fail :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, DomainContraposable (P x)) -> DomainContraposable (forall x : A, P x).
Proof.
  unfold DomainContraposable.
Abort.

Lemma DomainContraposable_exists :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, DomainContraposable (P x)) -> DomainContraposable (exists x : A, P x).

Zdania kontrapozowalne przeciwdziedzinowo


Definition CodomainContraposable (P : Prop) : Prop :=
  forall R : Prop, (~ P -> ~ R) -> (R -> P).

Lemma CodomainContraposable_True :
  CodomainContraposable True.

Lemma CodomainContraposable_False :
  CodomainContraposable False.

Lemma CodomainContraposable_impl :
  forall P Q : Prop,
    CodomainContraposable Q -> CodomainContraposable (P -> Q).

Lemma CodomainContraposable_or_fail :
  forall P Q : Prop,
    CodomainContraposable P -> CodomainContraposable Q -> CodomainContraposable (P \/ Q).
Proof.
  unfold CodomainContraposable.
  intros P Q HP HQ R nr r.
  left; apply HP with R; [| assumption].
  intros np _.
  apply nr; [| assumption].
  intros [p | q]; [contradiction |].
Abort.

Lemma CodomainContraposable_and :
  forall P Q : Prop,
    CodomainContraposable P -> CodomainContraposable Q -> CodomainContraposable (P /\ Q).

Lemma CodomainContraposable_iff :
  forall P Q : Prop,
    CodomainContraposable P -> CodomainContraposable Q -> CodomainContraposable (P <-> Q).

Lemma CodomainContraposable_not :
  forall P : Prop,
    CodomainContraposable P -> CodomainContraposable (~ P).

Lemma CodomainContraposable_forall :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, CodomainContraposable (P x)) -> CodomainContraposable (forall x : A, P x).

Lemma CodomainContraposable_exists_fail :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, CodomainContraposable (P x)) -> CodomainContraposable (exists x : A, P x).
Proof.
  unfold CodomainContraposable.
  intros A P HP R nr r.
Abort.

Logika klasyczna jako logika cudownych konsekwencji (TODO)

Logika cudownych konsekwencji


Lemma consequentia_mirabilis :
  forall P : Prop, (~ P -> P) -> P.
Proof.
  intros P H. apply H. intro p.
Abort.

Lemma Irrefutable_CM :
  forall P : Prop, ~ ~ ((~ P -> P) -> P).
Proof.
  intros P H. apply H.
  intro npp. apply npp.
  intro p. apply H.
  intros _. assumption.
Qed.

Lemma CM_LEM :
  CM -> LEM.

Lemma CM_MI :
  CM -> MI.

Lemma CM_ME :
  CM -> ME.

Lemma CM_DNE :
  CM -> DNE.

Lemma CM_Peirce :
  CM -> Peirce.

Lemma CM_Contra :
  CM -> Contra.

Zdania cudowne


Definition Wonderful (P : Prop) : Prop :=
  (~ P -> P) -> P.

Lemma Wonderful_True :
  Wonderful True.

Lemma Wonderful_False :
  Wonderful False.

Lemma Wonderful_impl :
  forall P Q : Prop,
    Wonderful P -> Wonderful Q -> Wonderful (P -> Q).

Lemma Wonderful_or_fail :
  forall P Q : Prop,
    Wonderful P -> Wonderful Q -> Wonderful (P \/ Q).
Proof.
  unfold Wonderful.
  intros P Q WP WQ H.
  apply H.
  intros [p | q].
Abort.

Lemma Wonderful_and :
  forall P Q : Prop,
    Wonderful P -> Wonderful Q -> Wonderful (P /\ Q).

Lemma Wonderful_iff :
  forall P Q : Prop,
    Wonderful P -> Wonderful Q -> Wonderful (P <-> Q).

Lemma Wonderful_not :
  forall P : Prop,
    Wonderful P -> Wonderful (~ P).

Lemma Wonderful_forall :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Wonderful (P x)) -> Wonderful (forall x : A, P x).

Lemma Wonderful_exists_fail :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Wonderful (P x)) -> Wonderful (exists x : A, P x).
Proof.
  unfold Wonderful.
  intros A P W Hn.
  apply Hn. intros [x p].
Abort.

Logika Peirce'a


Lemma Peirce_hard :
  forall P Q : Prop, ((P -> Q) -> P) -> P.
Proof.
  intros P Q H.
  apply H. intro p.
Abort.

Lemma not_Peirce_hard :
  forall P Q : Prop, ~ (((P -> Q) -> P) -> P).
Proof.
  intros P Q n.
Abort.

Lemma Irrefutable_Peirce :
  forall P Q : Prop, ~ ~ (((P -> Q) -> P) -> P).
Proof.
  intros P Q H.
  apply H. intro pqp.
  apply pqp. intro p.
  exfalso.
  apply H. intros _.
  assumption.
Qed.

Lemma Peirce_LEM :
  Peirce -> LEM.

Lemma Peirce_MI :
  Peirce -> MI.

Lemma Peirce_ME :
  Peirce -> ME.

Lemma Peirce_DNE :
  Peirce -> DNE.

Lemma Peirce_CM :
  Peirce -> CM.

Lemma Peirce_Contra :
  Peirce -> Contra.

Logika zdań penetrowalnych


Definition Penetrable (P : Prop) : Prop :=
  forall R : Prop, ((P -> R) -> P) -> P.

Lemma Penetrable_True :
  Penetrable True.

Lemma Penetrable_False :
  Penetrable False.

Lemma Penetrable_and :
  forall P Q : Prop,
    Penetrable P -> Penetrable Q -> Penetrable (P /\ Q).

Lemma Penetrable_or_fail :
  forall P Q : Prop,
    Penetrable P -> Penetrable Q -> Penetrable (P \/ Q).
Proof.
  unfold Penetrable.
  intros P Q HP HQ R HR.
  apply HR.
  intros [p | q].
Restart.
  unfold Penetrable.
  intros P Q HP HQ R HR.
  left.
  apply HP with Q; intros pq.
  apply HP with R; intros pr.
  assert (P \/ Q).
  {
    apply HR.
    intros [p | q].
    - apply pr.
      assumption.
    - admit.
  }
Abort.

Lemma Penetrable_impl :
  forall P Q : Prop,
    Penetrable Q -> Penetrable (P -> Q).

Lemma Penetrable_not :
  forall P : Prop,
    Penetrable P -> Penetrable (~ P).

Lemma Penetrable_forall :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Penetrable (P x)) -> Penetrable (forall x : A, P x).

Lemma Penetrable_exists_fail :
  forall (A : Type) (P : A -> Prop),
    (forall x : A, Penetrable (P x)) -> Penetrable (exists x : A, P x).
Proof.
  unfold Penetrable.
  intros A P HP R HR.
  apply HR; intros [x px].
Abort.

Aksjomaty i pojęcie "tabu" (TODO)

Tutaj o tym, co to znaczy, że w logice konstruktywnej LEM i tympodobne są tabu.
Drobna klasyfikacja na coś w stylu:
TODO: być może dać to do podrozdziału o WLEM

Pułapki negacji. O negowaniu słabym i mocnym (TODO)



Poznaliśmy uprzednio pewien spójnik, zapisywany wdzięcznym wygibaskiem ~, a zwany górnolotnie negacją. Powinniśmy się jednak zastanowić: czy spójnik ten jest dla nas zadowalający? Czy pozwala on nam wyrażać nasze przemyślenia w najlepszy możliwy sposób?
Jeżeli twoja odpowiedź brzmi "tak", to uroczyście oświadczam, że wcale nie masz racji. Wyobraźmy sobie następującą sytuację: jesteśmy psycho patusem, próbującym pod pozorem podrywu poobrażać przeróżne panienki.
Podbijamy do pierwszej z brzegu, która akurat jest normalną dziewczyną, i mówimy: "Hej mała, jesteś gruba i mądra". Nasza oburzona rozmówczyni, jako że jest szczupła, odpowiada nam: "Wcale nie jestem gruba. Spadaj frajerze".
Teraz na cel bierzemy kolejną, która siedzi sobie samotnie przy stoliku w Starbuniu, popija kawkę z papierowego kubka i z uśmiechem na ustach próbuje udowodnić w Coqu jakieś bardzo skomplikowane twierdzenie. Podbijamy do niej i mówimy: "Hej mała, jesteś gruba i mądra". Jako, że ona też jest szczupła, oburza się i odpowiada nam tak:
"Czekaj, czekaj, Romeo. Załóżmy, że twój tani podryw jest zgodny z prawdą. Gdybym była gruba i mądra, to byłabym w szczególności mądra, bo P i Q implikuje Q. Ale gdybym była mądra, to wiedziałabym, żeby tyle nie żreć, a skoro tak, to bym nie żarła, więc nie byłabym gruba, ale na mocy założenia jestem, więc twój podryw jest sprzeczny. Jeżeli nie umiesz logiki, nie idę z tobą do łóżka."
Widzisz różnicę w tych dwóch odpowiedziach? Pierwsza z nich wydaje nam się bardzo naturalna, bo przypomina zaprzeczenia, jakich zwykli ludzie używają w codziennych rozmowach. Druga wydaje się zawoalowana i bardziej przypomina dowód w Coqu niż codzienne rozmowy. Między oboma odpowiedziami jest łatwo zauważalna przepaść.
Żeby zrozumieć tę przepaść, wprowadzimy pojęcia silnej i słabej negacji. W powyższym przykładzie silną negacją posłużyła się pierwsza dziewczyna - silną negacją zdania "jesteś gruba i mądra" jest tutaj zdanie "wcale nie jestem gruba". Oczywiście jest też druga możliwość silnego zaprzeczenia temu zdaniu - "nie jestem mądra" - ale z jakichś powodów to zaprzeczenie nie padło. Ciekawe dlaczego? Druga dziewczyna natomiast posłużyła się słabą negacją, odpowiadając "gdybym była gruba i mądra, to... (tutaj długaśne rozumowanie)... więc sprzeczność".
Słaba negacja to ta, którą już znamy, czyli Coqowe not. Ma ona charakter hipotetyczny, gdyż jest po prostu implikacją, której konkluzją jest False. W rozumowaniach słownych sprowadza się ona do schematu "gdyby tak było, to wtedy... a zatem sprzeczność".
Silna negacja to najbardziej bezpośredni sposób zaprzeczenia danemu zdaniu. W Coqu nie ma żadnego spójnika, który ją wyraża, bo ma ona charakter dość ad hoc - dla każdego zdania musimy sami sobie wymyślić, jak brzmi zdanie, które najsilniej mu przeczy. W rozumowaniach słownych silna negacja sprowadza się zazwyczaj do schematu "nie jest tak".
Spróbujmy przetłumaczyć powyższe rozważania na język logiki. Niech P oznacza "gruba", zaś Q - "mądra". Silną negacją zdania P /\ Q jest zdanie ~ P \/ ~ Q ("nie gruba lub nie mądra"), zaś jego słabą negacją jest ~ (P /\ Q), czyli P /\ Q -> False ("jeżeli gruba i mądra, to sprzeczność").
Zauważmy, że o ile słaba negacja jest uniwersalna, tj. słabą negacją P /\ Q zawsze jest ~ (P /\ Q), to silna negacja jest ad hoc w tym sensie, że gdyby P było postaci P1 /\ P2, to wtedy silną negacją P /\ Q nie jest już ~ P \/ ~ Q, a ~ P1 \/ ~ P2 \/ ~ Q - żeby uzyskać silną negację, musimy zanegować P silnie, a nie słabo.
Dlaczego silna negacja jest silna, a słaba jest słaba, tzn. dlaczego nazwaliśmy je tak a nie inaczej? Wyjaśnia to poniższe twierdzenie oraz następująca po nim beznadziejna próba udowodnienia analogicznego twierdzenia z implikacją idącą w drugą stronę.

Lemma strong_to_weak_and :
  forall P Q : Prop, ~ P \/ ~ Q -> ~ (P /\ Q).
Proof.
  intros P Q Hor Hand.
  destruct Hand as [p q].
  destruct Hor as [notp | notq].
    apply notp. assumption.
    apply notq. assumption.
Qed.

Jak widać, silna negacja koniunkcji pociąga za sobą jej słabą negację. Powód tego jest prosty: jeżeli jeden z koniunktów nie zachodzi, ale założymy, że oba zachodzą, to w szczególności każdy z nich zachodzi osobno i mamy sprzeczność.
A czy implikacja w drugą stronę zachodzi?

Lemma weak_to_strong_and :
  forall P Q : Prop, ~ (P /\ Q) -> ~ P \/ ~ Q.
Proof.
  intros P Q notpq. left. intro p. apply notpq. split.
    assumption.
Abort.

Jak widać, nie udało nam się udowodnić odwrotnej implikacji i to wcale nie dlatego, że jesteśmy mało zdolni - po prostu konstruktywnie nie da się tego zrobić.
Powód tego jest prosty: jeżeli wiemy, że P i Q razem prowadzą do sprzeczności, to wiemy zdecydowanie za mało. Mogą być dwa powody:
Żeby zrozumieć pierwszą możliwość, niech P oznacza "siedzę", a Q - "stoję". Rozważmy zdanie P /\ Q, czyli "siedzę i stoję". Żeby nie było za łatwo załóżmy też, że znajdujesz się po drugiej stronie kosmosu i mnie nie widzisz.
Oczywiście nie mogę jednocześnie siedzieć i stać, gdyż czynności te się wykluczają, więc możesz skonkludować, że ~ (P /\ Q). Czy możesz jednak wywnioskować stąd, że ~ P \/ ~ Q, czyli że "nie siedzę lub nie stoję"? Konstruktywnie nie, bo będąc po drugiej stronie kosmosu nie wiesz, której z tych dwóch czynności nie wykonuję.
Z drugim przypadkiem jest tak samo, jak z końcówką powyższego przykładu: nawet jeżeli zdania P i Q się wzajemnie nie wykluczają i niesłuszność P /\ Q wynika z tego, że któryś z koniunktów nie zachodzi, to możemy po prostu nie wiedzieć, o który z nich chodzi.
Żeby jeszcze wzmocnić nasze zrozumienie, spróbujmy w zaskakujący sposób rozwinąć definicję (słabej) negacji dla koniunkcji:

Lemma not_and_surprising :
  forall P Q : Prop, ~ (P /\ Q) <-> (P -> ~ Q).
Proof.
  split.
    intros npq p q. apply npq. split.
      assumption.
      assumption.
    intros pnq pq. destruct pq as [p q]. apply pnq.
      assumption.
      assumption.
Qed.

I jeszcze raz...

Lemma not_and_surprising' :
  forall P Q : Prop, ~ (P /\ Q) <-> (Q -> ~ P).

Jak (mam nadzieję) widać, słaba negacja koniunkcji nie jest niczym innym niż stwierdzeniem, że oba koniunkty nie mogą zachodzić razem. Jest to więc coś znacznie słabszego, niż stwierdzenie, że któryś z koniunktów nie zachodzi z osobna.

Lemma mid_neg_conv :
  forall P Q : Prop, ~ (P /\ Q) -> ((P -> ~ Q) /\ (Q -> ~ P)).
Proof.
  firstorder.
Qed.

Jak napisano w Piśmie, nie samą koniunkcją żyje człowiek. Podumajmy więc, jak wygląda silna negacja dysjunkcji. Jeżeli chcemy dosadnie powiedzieć, że P \/ Q nie zachodzi, to najprościej powiedzieć: ~ P /\ ~ Q. Słaba negacja dysjunkcji ma zaś rzecz jasna postać ~ (P \/ Q).

Lemma strong_to_weak_or :
  forall P Q : Prop, ~ P /\ ~ Q -> ~ (P \/ Q).
Proof.
  do 2 destruct 1; contradiction.
Qed.

Co jednak dość ciekawe, silna negacja nie zawsze jest silniejsza od słabej (ale z pewnością nie może być od niej słabsza - gdyby mogła, to nazywałaby się inaczej). W przypadku dysjunkcji obie negacje są równoważne, co obrazuje poniższe twierdzenie, które głosi, że słaba negacja implikuje silną (a to razem z powyższym daje równoważność):

Lemma weak_to_strong_or :
  forall P Q : Prop, ~ (P \/ Q) -> ~ P /\ ~ Q.
Proof.
  split; intro; apply H; [left | right]; assumption.
Qed.

Wynika to z faktu, że ~ P /\ ~ Q to tak naprawdę para implikacji P -> False i Q -> False, zaś ~ (P \/ Q) to... gdy pomyślimy nad tym odpowiednio mocno... ta sama para implikacji. Jest tak dlatego, że jeżeli P \/ Q implikuje R, to umieć wyprodukować R musimy zarówno z samego P, jak i z samego Q.

Lemma deMorgan_dbl_neg :
  (forall P Q : Prop, ~ (P /\ Q) -> ~ P \/ ~ Q) <->
  (forall P : Prop, ~ ~ P -> P).
Proof.
  split.
    intros deMorgan P H.
Abort.

Stary podrozdział, do naprawy


Lemma material_implication_conv :
  forall P Q : Prop, ~ P \/ Q -> (P -> Q).
Proof.
  intros P Q H. destruct H as [np | q].
    intro p. contradiction.
    intro p. assumption.
Qed.

Lemma material_implication' :
  forall P Q : Prop, (P -> Q) -> ~ P \/ Q.
Proof.
  intros P Q H. left. intro p. specialize (H p).
Restart.
  intros P Q H. right. apply H.
Abort.

Lemma Irrefutable_MI :
  forall P Q : Prop, ~ ~ ((P -> Q) -> ~ P \/ Q).
Proof.
  intros P Q H.
  apply H. intro pq.
  left. intro.
  apply H. intros _.
  right. apply pq.
  assumption.
Qed.

Lemma MI_LEM :
  MI -> LEM.

Lemma MI_DNE :
  MI -> DNE.

Lemma MI_CM :
  MI -> CM.

Lemma MI_ME :
  MI -> ME.

Lemma MI_Peirce :
  MI -> Peirce.

Lemma MI_Contra :
  MI -> Contra.

Lemma material_equivalence_conv :
  forall P Q : Prop, (P /\ Q) \/ (~ P /\ ~ Q) -> (P <-> Q).

Lemma material_equivalence :
  forall P Q : Prop, (P <-> Q) -> (P /\ Q) \/ (~ P /\ ~ Q).
Proof.
  intros P Q [pq qp]. left. split.
    apply qp. apply pq.
Restart.
  intros P Q [pq qp]. right. split.
    intro p.
Abort.

Lemma Irrefutable_ME :
  forall P Q : Prop, ~ ~ ((P <-> Q) -> (P /\ Q) \/ (~ P /\ ~ Q)).

Lemma ME_LEM :
  ME -> LEM.

Lemma ME_DNE :
  ME -> DNE.

Lemma ME_MI :
  ME -> MI.

Lemma ME_CM :
  ME -> CM.

Lemma ME_Peirce :
  ME -> Peirce.

Lemma ME_Contra :
  ME -> Contra.

Klasyczna logika pierwszego rzędu (TODO)

Paradoks pijoka


Lemma drinkers_paradox :
  LEM ->
    forall (man : Type) (drinks : man -> Prop) (random_guy : man),
      exists drinker : man, drinks drinker ->
        forall x : man, drinks x.

Na zakończenie zwróćmy swą uwagę ku kolejnemu paradoksowi, tym razem dotyczącemu logiki klasycznej. Z angielska zwie się on "drinker's paradox", ja zaś ku powszechnej wesołości używał będę nazwy "paradoks pijoka".
Zazwyczaj jest on wyrażany mniej więcej tak: w każdym barze jest taki człowiek, że jeżeli on pije, to wszyscy piją. Jak to możliwe? Czy matematyka stwierdza istnienie magicznych ludzi zdolnych popaść swoich barowych towarzyszy w alkoholizm?
Oczywiście nie. W celu osiągnięcia oświecenia w tej kwestii prześledźmy dowód tego faktu (jeżeli nie udało ci się go wymyślić, pomyśl jeszcze trochę).
Ustalmy najpierw, jak ma się formalne brzmienie twierdzenia do naszej poetyckiej parafrazy dwa akapity wyżej. Początek "w każdym barze" możemy pominąć i sformalizować sytuację w pewnym konkretnym barze. Nie ma to znaczenia dla prawdziwości tego zdania.
Sytuację w barze modelujemy za pomocą typu man, które reprezentuje klientów baru, predykatu drinks, interpretowanego tak, że drinks x oznacza, że x pije. Pojawia się też osoba określona tajemniczym mianem random_guy. Jest ona konieczna, gdyż nasza poetycka parafraza czyni jedno założenie implicite: mianowicie, że w barze ktoś jest. Jest ono konieczne, gdyż gdyby w barze nie było nikogo, to w szczególności nie mogłoby tam być nikogo, kto spełnia jakieś dodatkowe warunki.
I tak docieramy do sedna sprawy: istnieje osoba, którą będziemy zwać pijokiem (exists drinker : man), taka, że jeżeli ona pije (drinks drinker), to wszyscy piją (forall x : man, drinks x).
Dowód jest banalny i opiera się na zasadzie wyłączonego środka, w Coqu zwanej classic. Dzięki niej możemy sprowadzić dowód do analizy dwóch przypadków.
Przypadek 1: wszyscy piją. Cóż, skoro wszyscy piją, to wszyscy piją. Pozostaje nam wskazać pijoka: mógłby to być ktokolwiek, ale z konieczności zostaje nim random_guy, gdyż do żadnego innego klienta baru nie możemy się odnieść.
Przypadek 2: nieprawda, że wszyscy piją. Parafrazując: istnieje ktoś, kto nie pije. Jest to obserwacja kluczowa. Skoro kolo przyszedł do baru i nie pije, to z automatu jest podejrzany. Uczyńmy go więc, wbrew zdrowemu rozsądkowi, naszym pijokiem.
Pozostaje nam udowodnić, że jeżeli pijok pije, to wszyscy piją. Załóżmy więc, że pijok pije. Wiemy jednak skądinąd, że pijok nie pije. Wobec tego mamy sprzeczność i wszyscy piją (a także jedzą naleśniki z betonem serwowane przez gadające ślimaki i robią dużo innych dziwnych rzeczy — wszakże ex falso quodlibet).
Gdzież więc leży paradoksalność całego paradoksu? Wynika ona w znacznej mierze ze znaczenia słowa "jeżeli". W mowie potocznej różni się ono znacznie od tzw. implikacji materialnej, w Coqu reprezentowanej (ale tylko przy założeniu reguły wyłączonego środka) przez implikację (->).
Określenie "taka osoba, że jeżeli ona pije, to wszyscy piją" przeciętny człowiek interpretuje w kategoriach przyczyny i skutku, a więc przypisuje rzeczonej osobie magiczną zdolność zmuszania wszystkich do picia, tak jakby posiadała zdolność wznoszenia toastów za pomocą telepatii.
Jest to błąd, gdyż zamierzonym znaczeniem słowa jeżeli jest tutaj (ze względu na kontekst matematyczny) implikacja materialna. W jednym z powyższych ćwiczeń udowodniłeś, że w logice klasycznej mamy tautologię P -> Q <-> ~ P \/ Q, a więc że implikacja jest prawdziwa gdy jej przesłanka jest fałszywa lub gdy jej konkluzja jest prawdziwa.
Do paradoksalności paradoksu swoje cegiełki dokładają też reguły logiki klasycznej (wyłączony środek) oraz logiki konstruktywnej (ex falso quodlibet), których w użyliśmy w dowodzie, a które dla zwykłego człowieka nie muszą być takie oczywiste.

Ćwiczenie (logika klasyczna)

W powyższym dowodzie logiki klasycznej użyłem conajmniej dwukrotnie. Zacytuj wszystkie fragmenty dowodu wykorzystujące logikę klasyczną.

Ćwiczenie (niepusty bar)

Pokaż, że założenie o tym, że w barze jest conajmniej jeden klient, jest konieczne. Co więcej, pokaż że stwierdzenie "w barze jest taki klient, że jeżeli on pije, to wszyscy piją" jest równoważne stwierdzeniu "w barze jest jakiś klient".
Które z tych dwóch implikacji wymagają logiki intuicjonistycznej, a które klasycznej?

Lemma dp_nonempty :
  LEM ->
    forall (man : Type) (drinks : man -> Prop),
      (exists drinker : man, drinks drinker ->
        forall x : man, drinks x) <->
      (exists x : man, True).


Double negation shift

TODO SUPER WAŻNE: logika klasyczna to nie tylko rachunek zdań, ale też kwantyfikatory!

Lemma not_not_forall :
  (forall (A : Type) (P : A -> Prop),
    (forall x : A, ~ ~ P x) -> (~ ~ forall x : A, P x))
    <->
  (~ ~ forall P : Prop, P \/ ~ P).

Wzięte z https://ncatlab.org/nlab/show/double-negation+shift

Definition DNS : Prop :=
  forall (A : Type) (P : A -> Prop),
    (forall x : A, ~ ~ P x) -> ~ ~ forall x : A, P x.

Lemma DNS_not_not_LEM :
  DNS <-> ~ ~ LEM.

Klasyczna logika wyższego rzędu (TODO)

Aksjomat wyboru (TODO)

Być może jest to właściwe miejsce, by wprowadzić aksjomaty wyboru.

Interpretacja obliczeniowa logiki klasycznej, a raczej jej brak (TODO)

Tu opisać, jak aksjomaty mają się do prawa zachowania informacji i zawartości obliczeniowej.

Porównanie logiki konstruktywnej i klasycznej (TODO)

Uniwersum SProp (TODO)


Inductive sEmpty : SProp := .

Inductive sUnit : SProp :=
| stt : sUnit.

Inductive seq {A : Type} (x : A) : A -> SProp :=
| srefl : seq x x.

Goal forall A : Type, sEmpty -> A.
Proof.
  destruct 1.
Qed.

Goal
  forall {A : Type} (P : A -> Type) (x y : A),
    seq x y -> P x -> P y.
Proof.
  intros A P x y Hs Hp.
Abort.

Inductive Box (A : Type) : Prop :=
| box : A -> Box A.

Konkluzja (TODO)

Ściąga

Zadania (TODO)

Wyrzucić zadania mącące (mieszające typy i zdania)

Require Classical.

Section ClassicalExercises.

Import Classical.

Hypotheses P Q R S : Prop.

Komenda Require Import pozwala nam zaimportować żądany moduł z biblioteki standardowej Coqa. Dzięki temu będziemy mogli używać zawartych w nim definicji, twierdzeń etc.
Classical to moduł, który pozwala przeprowadzać rozumowania w logice klasycznej. Deklaruje on jako aksjomaty niektóre tautologie logiki klasycznej, np. zasadę wyłączonego środka, która tutaj nazywa się classic.

Check classic.
(* ===> forall P : Prop, P \/ ~ P *)

Lemma imp_and_or : (P -> Q \/ R) -> ((P -> Q) \/ (P -> R)).

Lemma deMorgan_2_conv : ~ (P /\ Q) -> ~ P \/ ~ Q.

Lemma not_impl : ~ (P -> Q) -> P /\ ~ Q.

Lemma impl_not_or : (P -> Q) -> (~ P \/ Q).

Lemma material_implication : (P -> Q) <-> (~ P \/ Q).

Lemma contraposition_conv : (~ Q -> ~ P) -> (P -> Q).

Lemma excluded_middle : P \/ ~ P.

Lemma peirce : ((P -> Q) -> P) -> P.

End ClassicalExercises.