Beweren en bewijzen/het verhaal/6. Theorie/casus Drieminutenlicht

Uit Werkplaats
< Beweren en bewijzen‎ | het verhaal‎ | 6. Theorie
Versie door Engelbert Hubbers (overleg | bijdragen) op 26 jan 2011 om 16:35
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Ga naar: navigatie, zoeken
de opzet 2017-18    KalenderIcon.gif multimedia kwaliteit commentaren
site map


Beweren en bewijzen
Wijsheid omgaan met onzekerheid: met open blik op wankele ondergrond levenspad bewandelen
Vernuft aanpak van glibberige problemen precies redeneren op het hoogste niveau
vier zuilen → Artefacten Formalisering Taal Zekerheid
1. Rationaliteit Rationaliteitsvierkant 4 werelden Beweren is moeilijk Overtuigen
2. Modellen Focus Precisie Logica Stelling en bewijs
3. Model en realiteit Specificaties Domeinmodel Syntax en semantiek Waarheid
4. Correctheid Structuur Correctheidsstelling Typering Nagaan
5. Methoden Decompositie Systemat. vertalen Definities Natuurl. deductie
6. Theorie Domeintheorie Tijd Tijdslogica Wiskunde
7. Complexiteit Hiërarch. decompositie Vereenvoudigingen Modules Bewijsassistenten
8. Generalisering Standaardisatie Parametrisatie Talen Hulpstellingen
Beweren en bewijzen/het verhaal/6. Theorie/casus Drieminutenlicht

Aan deze pagina wordt nog gewerkt. Bedankt voor uw begrip.

Een drieminutenlicht moet na druk op de knop drie minuten branden, maar het mag niet ongewenst branden. Het dient tenslotte ter energiebesparing.

Specificaties

Een mogelijke specificatie is de volgende:

(∀t:T, Dr t → (∀t':(t,t+3], Li t'))
∧
(∀t:T, Li t → (∃t':[t-3,t), Dr t'))

met domeinmodel

domeinmodel
type betekenis (verzameling)
T de tijd: reële getallen, eenheid min
predikaat type betekenis meting
Dr T→B Dr t: op moment t wordt op de knop gedrukt kijken
Li T→B Li t: op moment t schijnt er licht kijken

Men kan dit ook korter opschrijven, maar het voor de hand liggende veranderen van de eerste implicatie in een dubbele implicatie leidt tot een verkeerde specificatie.

Veranderen van de tweede implicatie in een dubbele implicatie leidt tot:

∀t:T, Li t ↔ (∃t':[t-3,t), Dr t')

Deze specificatie is wél equivalent aan de eerste, twee keer zo lange specificatie. Dit komt omdat

∀t:T. Dr t → (∀t':(t,t+3]. Li t')

logisch equivalent is aan:

∀t:T, (∃t':[t-3,t), Dr t') → Li t

Om dit te bewijzen moeten we aantonen:

∀t:T, Dr t → (∀t':(t,t+3], Li t') |- ∀t:T, (∃t':[t-3,t), Dr t') → Li t

En:

 ∀t:T, (∃t':[t-3,t), Dr t') → Li t |- ∀t:T, Dr t → (∀t':(t,t+3], Li t')

Voorbeelden voor bewijzen

Dit zijn twee interessante bewijzen, omdat tijd een rol speelt en het interval als het ware omklapt van gesloten naar open en vice versa. De bewijzen zijn bovendien uitgevoerd m.b.v. Coq.

Redeneren in natuurlijke taal

Als illustratie beredeneren we de eerste eigenschap in natuurlijke taal, dat wil zeggen als een lopende tekst. Hieronder doen we dat vrij uitgebreid, om de toepassingen van de deductieregels goed zichtbaar te maken. Als je het mechanisme eenmaal doorhebt, ligt het voor de hand waar je compacter kunt formuleren. We nummeren de aannamen en tussenconclusies om er gemakkelijk naar te kunnen verwijzen. Tijdens het construeren van een bewijs is een lijstje van zulke 'te gebruiken resultaten' erg handig!

Voor een redenering in natuurlijke taal is het nodig een precieze definitie van de gebruikte begrippen achter de hand te hebben. In dit geval lezen we die af in de formele specificatie hierboven.

Bijvoorbeeld: "het licht brandt even na t gedurende 3 minuten" betekent dat het licht brandt op elk tijdstip in het interval (t,t+3].

Op naar het bewijs. We schrijven op wat we moeten bewijzen, en gaan systematisch aan het werk via de logische structuur (kwantoren, voegtekens) van de uitspraken.


We nemen aan: voor elk tijdstip t: als er op t op de knop gedrukt wordt, dan brandt het licht even daarna gedurende 3 minuten (1).

We moeten bewijzen: voor elk tijdstip t: als er in de 3 minuten voorafgaand aan t op de knop gedrukt is, dan brandt het licht op t.

BEWIJS

Laat t een willekeurig tijdstip zijn.

Stel: er is in de 3 minuten voorafgaand aan t op de knop gedrukt (2). (We gaan bewijzen: het licht brandt op t.)

Gebruik (2): noem het tijdstip van knopdrukken even x. Dan: t-3 <= x (3), x < t (4) en er wordt op x op de knop gedrukt (5).

Met (1) hebben we in het bijzonder: als er op x op de knop gedrukt wordt, dan brandt het licht even daarna gedurende 3 minuten (6).

Uit (5) en (6) volgt: het licht brandt even na x gedurende 3 minuten, dat wil zeggen gedurende het interval (x,x+3] (7).

We laten zien dat t in dit interval zit, dat wil zeggen x < t en t <= x+3. Het eerste geldt volgens (4). We hebben volgens (3): t-3 <= x, dus t-3+3 <= x+3, met andere woorden: t <= x+3. Dus t zit inderdaad in het interval (x,x+3].

Dus, met behulp van (7): het licht brandt op t.

We hebben over x verder geen aannamen gemaakt, dus in elk geval: het licht brandt op t.

We concluderen: als er in de 3 minuten voorafgaand aan t op de knop gedrukt is, dan brandt het licht op t.

Het tijdstip t was willekeurig, dus dit geldt voor elke t, hetgeen we moesten bewijzen.

Correctheidsstelling

Deze casus laat zien hoe een drieminutenlicht gebouwd kan worden met twee onderdelen: een tijdschakelaar en een lamp die met een signaal uit dan wel aan gaat.

Definition DRIEMINL :=
  (∀t:T, Dr t → (∀t':(t,t+3], Li t'))
   ∧
  (∀t:T, Li t → (∃t':[t-3,t), Dr t'))
.

Het domeinmodel is

domeinmodel
type betekenis (verzameling)
T de tijd: reële getallen, eenheid min
predikaat type betekenis meting
Dr T→B Dr t: op moment t wordt op de knop gedrukt kijken
Li T→B Li t: op moment t schijnt er licht kijken
RL T→B RL t: op moment t is er een elektrisch signaal op de ResetLatch poort van de lamp voltmeter

Onderdeel Tijdschakelaar

Dan en slechts dan wanneer er op de knop wordt gedrukt dan komt er 3 minuten later een elektrisch signaal op de ResetLatch poort. In Coq notatie:

Definition TIJDSCHAKELAAR := forall t:T, 
  (Dr t /\ (forall u:T, u in [t,t+3) -> ~Dr u) -> RL (t+3))
  /\
  (RL (t+3) -> Dr t /\ (forall u:T, u in [t,t+3) -> ~Dr u)).

Onderdeel Lamp

Het onderdeel is eigenlijk een samentrekking van twee dingen: een normale lamp die licht produceert en een SR Latch. Het drukken op de knop heeft een Set tot gevolg.

Als op een tijdstip t op de knop wordt gedrukt, dan brandt het licht d minuten later, mits er gedurende die d minuten geen signaal op de ResetLatch poort is. Bovendien als het licht schijnt op een tijdstip t, dan was er d minuten eerder op de knop gedrukt en was er gedurende die d minuten geen signaal op de ResetLatch poort en werd er ook niet op de knop gedrukt. Merk op dat dit betekent dat op tijdstip (t-d) de laatste keer voor t op de knop werd gedrukt. Merkop: door toe te voegen dat het de laatste keer was dat op de knop werd gedrukt is er iets meer informatie beschikbaar en wordt het bewijs eenvoudiger wat wel mag aangezien het al niet eenvoudig is. Kernpunt: hoe men de specificaties op stelt is van wezenlijk belang voor de moeilijkheid van het bewijs. Soms kan een ietwat andere formulering helpen terwijl het voor het onderdeel wel op hetzelfde neerkomt.

In Coq notatie:

Definition LAMP := forall t:T,
  (forall d:D, d>0 -> Dr t /\ (forall u:T, u in (t,t+d] -> ~RL u) -> Li (t+d))
  /\
  (Li t -> exists d:D, d>0 /\ Dr (t-d) /\ forall u:T, u in [t-d,t) -> ~RL u /\ ~Dr u).

Bewijs

De correctheidsstelling is simpelweg TIJDSCHAKELAAR, LAMP |= DRIEMINL. Het volledige bewijs is te vinden op [1]. Het volledige Coq script is te vinden op [2]. Om dit verhaal te kunnen volgen moet het Coq-script uitgevoerd worden. Het bewijs in Coq heeft een extra aanname nodig die verder voor de hand ligt. We doen dat in de vorm van een hypothese en wel als volgt:

Hypothesis hypo1 : forall d:D, ~ d <= 3 -> d > 3.

Kernpunt: als je iets triviaals niet kunt bewijzen met Coq, neem het dan op als hypothese.

We zullen nu het bewijs bespreken aan de hand van het Coq script. Onder ieder stukje script staat uitleg wat er gebeurt. Bekende dingen als toewerken naar aannames worden niet uitgelegd.

imp_i H1.
imp_i H2.
unfold DRIEMINL.
con_i.

Eerste deel

We gaan nu eerst bewijzen dat het licht wel zal schijnen. Later komt het andere deel: dat het licht niet zomaar schijnt.

all_i a.
imp_i H3.
all_i b.
imp_i H4.
unfold LAMP in H2.
replace b with (a+(b-a)).

We willen de conclusie bewijzen m.b.v. LAMP vandaar dat we de definitie uitvouwen om hem te kunnen bekijken. We vervangen b door (a+(b-a)), omdat we zo naar de vorm die LAMP heeft kunnen toewerken, in het achterhoofd houdende dat we Dr a hebben in onze aannames.

imp_e (Dr a /\ (forall u:T, u in (a,a+(b-a)] -> ~RL u)).
imp_e (b-a>0).
all_e (forall d:D, d>0 -> Dr a /\ (forall u:T,u in (a,a+d] -> ~RL u) -> Li (a+d)) (b-a).
con_e1 (Li a -> (exists d:D, d>0 /\ Dr (a-d) /\ (forall u:T, u in [a-d,a) -> ~RL u /\ ~Dr u))).
all_e (forall t:T,
(forall d:D, d>0 -> Dr t /\ (forall u:T, u in (t,t+d] -> ~RL u) -> Li (t+d))
/\
(Li t -> exists d:D, d>0 /\ Dr (t-d) /\ forall u:T, u in [t-d,t) -> ~RL u /\ ~Dr u)
) a.
assumption.

Naar aanname toewerken.

imp_e (a<b).
imp_i H5.
lin_solve. 

Uit (a<b) kunnen we met wat rekenen uiteraard de conclusie trekken, en (a<b) staat in een conjunctie in de aannames, namelijk in b in (a, a + 3], want dat is niets anders dan een conjunctie.

con_e1 (b<=a+3).
assumption.
clear H2.

Maak het rechterdeel van de conjunctie compleet. Ruim een nutteloze aanname op.

con_i.
assumption.

Dat was makkelijk, maar daarom hadden we ook (a+(b-a)) gekozen.

unfold TIJDSCHAKELAAR in H1.
all_i c.
imp_i H5.
neg_i (Dr a) H6.

Uit aanname H1 zien we dat als RL (t+3) geldt er tussen t en t+3 niet op de knop gedrukt was. Dus als we voor t invulllen c-3 dan wordt tussen c-3 en c niet op de knop gedrukt Uit de ongelijkheden valt af te leiden dat dan ondermeer niet op a op de knop wordt gedrukt. Tegenspraak met Dr a!

imp_e (a in [c-3,c-3+3)).
all_e (forall t':T, t' in [c-3,c-3+3) -> ~Dr t') a.
con_e2 (Dr (c-3)).
imp_e (RL (c-3+3)).
con_e2 (Dr (c-3) /\ (forall t':T, t' in [c-3,c-3+3) -> ~Dr t') -> RL (c-3+3)).
all_e (forall t:T,
  (Dr t /\ (forall t':T, t' in [t,t+3) -> ~Dr t') -> RL (t+3))
  /\
  (RL (t+3) -> Dr t /\ (forall t':T, t' in [t,t+3) -> ~Dr t'))) (c-3).
assumption.

Naar aaname toewerken.

replace (c-3+3) with c.
assumption.
lin_solve.

Wat simpel rekenwerk.

interval.
con_i.

Dit is standaard: om een interval te bewijzen moet je een conjunctie bewijzen.

imp_e (c <= a+3).
imp_i H7.
lin_solve.

Vervang de conclusie c-3 <= a met c <= a+3.

imp_e (b<=a+3).
imp_i H8.
lin_solve.
con_e2 (a<b).
assumption.
replace b with (a+(b-a)).
con_e2 (a<c).
assumption.
lin_solve.
imp_e (a<c).
imp_i H7.
lin_solve.
con_e1 (c<=a+(b-a)).
assumption.
assumption.
lin_solve.

c<=b en b<=a+3 staan in de aannames als intervallen. Uit deze twee formules volgt uiteraard de conclusie c<=a+3.

Tweede deel

Het tweede deel bewijst dat het licht niet zomaar schijnt. Het is een stuk moeilijker.

all_i a.
imp_i H3.
unfold LAMP in H2.
exi_e (exists d:D, d>0 /\ Dr (a-d) /\ forall u:T, u in [a-d,a) -> ~RL u /\ ~Dr u) e H4.

Uit Li a en de formule voor de lamp kunnen we eenvoudig het volgende concluderen:

(exists d:D, d>0 /\ Dr (a-d) /\ forall u:T, u in [a-d,a) -> ~RL u /\ ~Dr u) e H4.

Hierop doen we een existentie eliminatie.

imp_e (Li a).
con_e2 (forall d:D, d>0 -> Dr a /\ (forall u:T, u in (a,a+d] -> ~RL u) -> Li (a+d)).
all_e ( forall t:T,
  (forall d:D, d>0 -> Dr t /\ (forall u:T, u in (t,t+d] -> ~RL u) -> Li (t+d))
  /\
  (Li t -> exists d:D, d>0 /\ Dr (t-d) /\ forall u:T, u in [t-d,t) -> ~RL u /\ ~Dr u)
) a.
assumption.
assumption.

Werk naar de twee aannames toe.

exi_i (a-e).

Het licht brandt op tijdstip a. De variabele e representeert hoe lang het geleden is dat voor het laatst op de knop werd gedrukt. We zullen bewijzen dat er hooguit 3 minuten geleden op de knop werd gedrukt.

con_i.
interval.
con_i.
imp_e (e<=3).
imp_i H5.
lin_solve.

Eenvoudig rekenwerk.

neg_e' (RL (a-e+3)) H5.

Bewijs uit het ongerijmde! Door aan te nemen dat ~(a<=3), wat door de hypothese overeenkomt met a>3, zullen we bewijzen ~RL (a-e+3), terwijl uit aanname H4 eenvoudig valt te bewijzen dat dit juist wel het geval is.

con_e1 (~Dr (a-e+3)).
imp_e ((a-e+3) in [a-e,a)).
all_e (forall u:T, u in [a-e,a) -> ~RL u /\ ~Dr u) (a-e+3).
con_e2 (Dr (a-e)).
con_e2 (e>0).
assumption.
interval.
con_i.
lin_solve.
imp_e (e>3).
imp_i H6.
lin_solve.
imp_e (~e<=3).
all_e (forall d:D, ~d<=3 -> d>3) e.
exact hypo1.
assumption.

Dit bewijst ~RL (a-e+3).

clear H2.
unfold TIJDSCHAKELAAR in H1.
imp_e (Dr (a-e) /\ (forall u:T, u in [a-e,a-e+3) -> ~Dr u)).
con_e1 (RL (a-e+3) -> Dr (a-e) /\ (forall u:T, u in [a-e,a-e+3) -> ~Dr u)).
all_e (forall t:T, 
  (Dr t /\ (forall u:T, u in [t,t+3) -> ~Dr u) -> RL (t+3))
  /\
  (RL (t+3) -> Dr t /\ (forall u:T, u in [t,t+3) -> ~Dr u))
) (a-e).
assumption.
con_i.
con_e1 (forall u:T, u in [a-e, a) -> ~RL u /\ ~Dr u).
con_e2 (e>0).
assumption.
all_i b.
imp_i H6.
con_e2 (~RL b).
imp_e (b in [a-e,a)).
all_e (forall u:T, u in [a-e,a) -> ~RL u /\ ~Dr u) b.
con_e2 (Dr (a-e)).
con_e2 (e>0).
assumption.
interval.
con_i.
con_e1 (b<a-e+3).
assumption.
imp_e (b<a-e+3).
imp_i H7.
imp_e (e>3).
imp_i H8.
lin_solve.
imp_e (~e<=3).
all_e (forall d:D, ~d<=3 -> d>3) e.
exact hypo1.
assumption.
con_e2 (a-e<=b).
assumption.
imp_e (e>0).
imp_i H5.
lin_solve.
con_e1 (Dr (a-e) /\ (forall u:T, u in [a-e,a) -> ~RL u /\ ~Dr u)).
assumption.
con_e1 (forall u:T, u in [a-e,a) -> ~RL u /\ ~Dr u).
con_e2 (e>0).
assumption.
Qed.