Τυπικές Μέθοδοι στην Ανάπτυξη Συστηµάτων Λογισµικού

Σχετικά έγγραφα
Εισαγωγή. Όλες οι (άλλες) επιστήµες µηχανικών βασίζονται σε σταθερό θεωρητικό (µαθηµατικό) υπόβαθρο

Γλώσσες προγραµµατισµού. Ανάπτυξη Συστηµάτων Λογισµικού

PECOS4SMEs Δξσηεκαηνιόγην Καηαλαισηώλ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΕΡΙΦΕΡΕΙΑ ΗΠΕΙΡΟΥ ΔΗΜΟΣ ΙΩΑΝΝΙΤΩΝ Δ/ΝΣΗ ΤΕΧΝΙΚΩΝ ΥΠΗΡΕΣΙΩΝ. Προμήθεια συστήματος υπόγειας αποθήκευσης απορριμμάτων

Εφαρμογές της Λογικής στην Πληροφορική

- International Scientific Electronic Journal, Issue 1, 2004 Department of Cultural Technology and Communication University of the Aegean

Συστηματικός έλεγχος ορθότητας ταυτόχρονων προγραμμάτων μέσω γράφου καταστάσεων

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

ΚΑΝΟΝΙΣΜΟΣ (EE) 2019/1238 ΤΟΥ ΕΥΡΩΠΑΪΚΟΥ ΚΟΙΝΟΒΟΥΛΙΟΥ ΚΑΙ ΤΟΥ ΣΥΜΒΟΥΛΙΟΥ

Μηχανική Μάθηση Μερωνυµιών για Αναγνώριση Γεγονότων

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Συστηματικός έλεγχος ορθότητας ταυτόχρονων προγραμμάτων μέσω γράφου καταστάσεων

Στοιχεία και έγγραφα που απαιτούνται για την εγγραφή στο ΓΕΜΗ

02 Αντικειμενοστρεφής Προγραμματισμός

ΜΑΘΗΜΑ: Εισαγωγή στις Αρχές της Επιστήμης των Η/Υ. 1 η ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ: ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ

ΙΑΓΡΑΜΜΑ ΠΕΡΙΕΧΟΜΕΝΩΝ

Μεταϖτυχιακή Εργασία. Εκτίµηση εϖικινδυνότητας της ϖοιότητας του νερού του δικτύου ύδρευσης του ήµου Ηρακλείου του Νοµού Ηρακλείου Κρήτης

Αυτόματος έλεγχος μοντέλων με το εργαλείο SPIN : Εφαρμογή σε μοντέλο συγχρονισμού αντικειμενοστρεφούς λογισμικού

ιαφάνειες παρουσίασης #1

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

Οι τυπικές μέθοδοι παρέχουν ένα πλαίσιο μέσα στο οποίο μπορούμε να προδιαγράψουμε και να εγκυροποιήσουμε ένα σύστημα με συστηματικό τρόπο.

πρακτικού συνεδριάσεως ιοικητικού ΗΜΟΣ ΠΑΤΜΟΥ

ΜΕΤΑΒΑΤΙΚΕΣ ΠΡΟΫΠΟΘΕΣΕΙΣ ΑΠΟΚΤΗΣΗΣ ΠΤΥΧΙΟΥ

Αλγεβρική Προδιαγραφή Προτύπων

Προχωρημένες έννοιες προγραμματισμού σε C

Απειροστικός Λογισμός Ι, χειμερινό εξάμηνο Λύσεις τέταρτου φυλλαδίου ασκήσεων. ( n(n+1) e 1 (

ιαφάνειες παρουσίασης #5 (β)

Ασφαλή Συστήματα Μέθοδοι ελέγχου και εξακρίβωσης ορθής λειτουργίας

ιαφάνειες παρουσίασης #4

Υλοποίηση ΛΑ με το flex

ΔΙΔΑΚΤΟΡΙΚΗ ΔΙΑΤΡΙΒΗ

Αντικειµενοστρεφής Προγραµµατισµός

3 Αλληλεπίδραση Αντικειμένων

πρακτικού συνεδριάσεως ιοικητικού ΗΜΟΣ ΠΑΤΜΟΥ

ΠΕΡΙΕΧΟΜΕΝΑ. Πρόλογος στη δεύτερη έκδοση

Νέος Αναπτυξιακός Νόµος - Επενδυτικός Νόµος 3299/2004

Προγραμματική Περίοδος

Τις ασκήσεις επιμελήθηκαν οι καθηγητές της Γ Γυμνασίου των σχολείων μας και ο συντονιστής Μαθηματικών.

15PROC

HY118- ιακριτά Μαθηµατικά

ΑΠΟΛΥΤΗ ΤΙΜΗ ΠΡΑΓΜΑΤΙΚΟΥ ΑΡΙΘΜΟΥ- ΑΣΚΗΣΕΙΣ

ιαφάνειες παρουσίασης #9 (α)

Υπουργού Οικονομικών» ΑΠΟΦΑΣΗ Ο ΥΠΟΥΡΓΟΣ ΟΙΚΟΝΟΜΙΚΩΝ

Πρόλογος. 1 Εισαγωγή Θεωρία Παιγνίων υό Λόγια για το Αντικείµενο Μερικά Ιστορικά Στοιχεία Ενα Παράδοξο Παιχνίδι...

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

Ποιές οι θεµελιώδεις δυνατότητες και ποιοί οι εγγενείς περιορισµοί των υπολογιστών ; Τί µπορούµε και τί δε µπορούµε να υπολογίσουµε (και γιατί);

Στοιχεία Θεωρίας Υπολογισµού (1): Τυπικές Γλώσσες, Γραµµατικές

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

ΕΛΤΙΟ ΤΥΠΟΥ. ΕΙΚΤΗΣ ΤΙΜΩΝ ΥΛΙΚΩΝ ΚΑΤΑΣΚΕΥΗΣ ΝΕΩΝ ΚΤΙΡΙΩΝ ΚΑΤΟΙΚΙΩΝ: εκέµβριος 2015 (2010=100,0)

ιαφάνειες παρουσίασης #3

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA

ΤΕΙ Θεσσαλονίκης Τμήμα Πληροφορικής

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Αντικειμενοστρεφής Προγραμματισμός

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΝΟΜΙΚΩΝ, ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΠΟΛΙΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΝΟΜΙΚΗΣ

ΜΑΘΗΜΑΤΙΚΑ Γ ΓΥΜΝΑΣΙΟΥ

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Α. ΣΥΝΟΛΑ-ΥΠΟΣΥΝΟΛΑ-ΙΣΑ ΣΥΝΟΛΑ

6. Εξαιρέσεις στη γλώσσα Java

Ε.Σ.Π.Α και Τοπική Αυτοδιοίκηση. Οι δυνατότητες ένταξης έργων και δράσεων της Τ.Α. στα Επιχειρησιακά Προγράμματα

ΠΑΡΑΡΤΗΜΑ ΠΡΩΤΟ ΤΗΣ ΕΠΙΣΗΜΗΣ ΕΦΗΜΕΡΙΔΑΣ ΤΗΣ ΔΗΜΟΚΡΑΤΙΑΣ Αρ της 6ης ΑΠΡΙΑΙΟΥ 1998 ΝΟΜΟΘΕΣΙΑ ΜΕΡΟΣ Ι

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Wrapper Classes, Abstract Classes and Interfaces

οκιμασία και πλάνο δοκιμασίας

Μάθηµα 1. Κεφάλαιο 1o: Συστήµατα. γ R παριστάνει ευθεία και καλείται γραµµική εξίσωση µε δύο αγνώστους.

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

Από τη UML στον Κώδικα. Μέρος Β

Ενότητα 11 (κεφάλαιο 27) Τυπική Προδιαγραφή

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Αποφασισιµότητα. HY118- ιακριτά Μαθηµατικά. Βασικές µέθοδοι απόδειξης. 07 -Αποδείξεις. ιακριτά Μαθηµατικά, Εαρινό εξάµηνο 2017

Week 7: Java Collection Classes

Κώδικας επιχειρηματικής συμπεριφοράς και δεοντολογίας. Παγκόσμια Συμμόρφωση Mylan ΠΕΡΙΟΧΗ ΕΜΕΑ - ΕΛΛΗΝΙΚΑ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΑΓΡΟΝΟΜΩΝ ΤΟΠΟΓΡΑΦΩΝ ΜΗΧΑΝΙΚΩΝ ΤΟΜΕΑΣ ΓΕΩΓΡΑΦΙΑΣ & ΠΕΡΙΦΕΡΕΙΑΚΟΥ ΣΧΕΔΙΑΣΜΟΥ

Βασικές Δομές μοντέλων Petri Nets. C.A. Petri

Θέματα Μεταγλωττιστών

Αντικειμενοστρεφής Προγραμματισμός

Ορισµός. Εστω συναρτήσεις: f : N R και g : N R. η f(n) είναι fi( g(n) ) αν υπάρχουν σταθερές C 1, C 2 και n 0, τέτοιες ώστε:

ΠΕΡΙΦΕΡΕΙΑ ΗΠΕΙΡΟΥ ΑΡ

Υπολογιστικά μοντέλα (MoC) για SoC

Εισαγωγή στην πληροφορική

ΠΡΟΣΚΛΗΣΗ ΕΚΔΗΛΩΣΗΣ ΕΝΔΙΑΦΕΡΟΝΤΟΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

Ειδικά Θέματα Προγραμματισμού

Εισαγωγή στην αντικειµενοστρεφή τεχνολογία

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

Εισαγωγή στον Προγ/μό Η/Υ

Υλοποίηση ΣΑ με το bison

(πρώην ΡΑΔΙΟ Α. ΚΟΡΑΣΙΔΗΣ TELECOM Α.Ε.) ΕΝΗΜΕΡΩΤΙΚΟ ΔΕΛΤΙΟ

ΗΥ Λογική. Διδάσκων: Δημήτρης Πλεξουσάκης Καθηγητής

Τεχνολογία Λογισµικού Ι Κεφάλαιο 5

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Προδιαγραφή και Επαλήθευση Πρωτοκόλλων Ασφαλείας Συστημάτων Κινητών Επικοινωνιών με Χρήση Τυπικών Μεθόδων

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Υλοποίηση ΣΑ με το bison

Συγγραφή κώδικα, δοκιμασία, επαλήθευση. Γιάννης Σμαραγδάκης

ΑΣΚΗΣΕΙΣ ΣΤΗ ΛΟΓΙΚΗ Α Ψ Α Ψ viii) 9. Α Ψ ix) Α Ψ xi) Α Ψ xii) 0 0. Α Ψ xiii) Α Ψ xiv) Α Ψ xv)

ΕΠΛ 664 Ανάλυση και Επαλήθευση Συστημάτων 1-1

Τεχνικές και Αλγόριθμοι Ταξινόμησης

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 10/1/08

Transcript:

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ http://coursessoftlabntuagr/softeng/ ιδάσκοντες: (nickie@softlabntuagr) Γιάννης Μαΐστρος (maistros@csntuagr) Βασίλης Βεσκούκης (bxb@softlabntuagr) Τυπικές Μέθοδοι στην Ανάπτυξη Συστηµάτων Λογισµικού Τυπικές µέθοδοι: υπέρ και κατά Software Engineering Όλες οι (άλλες) επιστήµες µηχανικών βασίζονται σε σταθερό θεωρητικό (µαθηµατικό) υπόβαθρο Θεωρητικό υπόβαθρο για την ΤΛ Επιστήµη υπολογιστών Επιστηµονικοί κλάδοι που αντιστοιχούν σε συγκεκριµένες περιοχές εφαρµογών, πχ µαθηµατικά, φυσική, στατική, αρχιτεκτονική 1 2 Μειονεκτήµατα της παραδοσιακής διαδικασίας ανάπτυξης λογισµικού Χρειάζεται µεγάλη προσπάθεια ώστε οι προδιαγραφές να µην είναι: διφορούµενες αφηρηµένες αντιφατικές ελλιπείς Ο έλεγχος κοστίζει και παρέχει µικρό βαθµό βεβαιότητας (~10 4 ) 114,000 χρόνια για 10 9! 3 Τυπικές µέθοδοι formal methods τεχνικές για την περιγραφή των ιδιοτήτων ενός συστήµατος, βασισµένες στα µαθηµατικά χρησιµοποιούνται για την προδιαγραφή, ανάπτυξη και επαλήθευση συστηµάτων µε συστηµατικό τρόπο η µαθηµατική βάση συνοδεύεται συνήθως από µια γλώσσα τυπικών προδιαγραφών και ορίζει έννοιες όπως: συνέπεια, πληρότητα προδιαγραφή, υλοποίηση, ορθότητα 4 Τυπικές µέθοδοι: υπέρ και κατά Τυπικές µέθοδοι: υπέρ και κατά Γιατί τίθεται έτσι αυτό το ζήτηµα; Πλεονεκτήµατα καλύτερη κατανόηση των απαιτήσεων και της σχεδίασης συστηµάτων λογισµικού χειρισµός προδιαγραφών ως µαθηµατικών αντικειµένων, πχ επαλήθευση (verification) αντί επικύρωσης (validation) αυτόµατη επεξεργασία προδιαγραφών και υποστήριξη από εργαλεία µείωση κόστους για έλεγχο και συντήρηση Μειονεκτήµατα αύξηση κόστους για ανάλυση και σχεδίαση έλλειψη σχετικής εκπαίδευσης ή/και απειρία των µηχανικών λογισµικού αδυναµία ή εγγενής δυσκολία των τυπικών µεθόδων να προδιαγράψουν ορισµένα είδη συστηµάτων λογισµικού έλλειψη καλών εργαλείων υποστήριξης Αποτέλεσµα αδράνεια και σκεπτικισµός ή ακόµα και άρνηση από την βιοµηχανία λογισµικού 5 6 1

Τυπικές µέθοδοι: υπέρ και κατά Μύθοι σχετικοί µε τις τυπικές µεθόδους µε τις ΤΜ παράγεται τέλειο λογισµικό ΤΜ = απόδειξη ορθότητας προγραµµάτων λόγω κόστους, οι ΤΜ έχουν νόηµα µόνο για συστήµατα λογισµικού υψηλής ασφάλειας οι ΤΜ αυξάνουν το συνολικό κόστος ανάπτυξης συστηµάτων λογισµικού οι πελάτες δεν µπορούν να καταλάβουν τις τυπικές προδιαγραφές οι ΤΜ έχουν χρησιµοποιηθεί µόνο για τετριµµένα ή πολύ απλά προβλήµατα [Hall 1990] Εργαλεία (ηµι-)αυτόµατης απόδειξης ACL2 Coq HOL IMPS Isabelle Nuprl PVS 7 8 Μέθοδοι, φορµαλισµοί και εργαλεία ASM: Abstract State Machines B-Method CSP: Communicating Sequential Processes DC: Duration Calculus ITL: Interval Temporal Logic Esterel Larch LOTOS Obj / CafeOBJ Μέθοδοι, φορµαλισµοί και εργαλεία (συνέχεια) Petri Nets Pi-Calculus RAISE: (Rigorous Approach to Industrial Software Engineering) SDL: Specification and Description Language TLA: Temporal Logic of Actions VDM: Vienna Development Method Z Notation 9 10 Πρόβληµα: αµοιβαίος αποκλεισµός σε περιβάλλον παράλληλης εκτέλεσης Μία λύση: the Bakery Algorithm υπάρχει ένα µηχάνηµα που εκδίδει αριθµούς προτεραιότητας κατά αύξουσα σειρά κάθε πελάτης που θέλει να εξυπηρετηθεί παίρνει αριθµό προτεραιότητας κάθε φορά εξυπηρετείται ο πελάτης µε το µικρότερο αριθµό προτεραιότητας Μία άτυπη περιγραφή της λύσης Κάθε πελάτης έχει µια αριθµητική µεταβλητή Αρχικά, η µεταβλητή του έχει την τιµή µηδέν Κάθε φορά που θέλει να εξυπηρετηθεί, δίνει στη µεταβλητή του µια τιµή µεγαλύτερη από τις µεταβλητές όλων των άλλων πελατών Στη συνέχεια περιµένει έως ότου η τιµή της µεταβλητής του γίνει µικρότερη από τις µεταβλητές όλων των άλλων πελατών Τότε εξυπηρετείται και στη συνέχεια ξαναδίνει στη µεταβλητή του την τιµή µηδέν 11 12 2

(iv) Μία υλοποίηση σε Java class Client extends Thread static List allclients = new LinkedList(); int ticket; public Client () ticket = 0; allclientsadd(this); void getserved (); void eatbread (); static int maxticket () int result = 0; for (Iterator i = allclientsiterator(); ihasnext();) Process p = (Process) inext(); if (pticket > 0 && pticket > result)) result = pticket; return result; 13 14 (v) (vi) static int minticket () int result = 0; for (Iterator i = clientsiterator(); ihasnext();) Process p = (Process) inext(); if (pticket > 0 && (result == 0 pticket < result)) result = pticket; return result; public void run () for (;;) synchronized (getclass()) ticket = maxticket() + 1; while (ticket > minticket()); // trying getserved(); // critical ticket = 0; eatbread(); // idle 15 16 Απαιτήσεις Ασφάλεια (safety): κάθε στιγµή εξυπηρετείται το πολύ ένας πελάτης Ζωντάνια (liveness): κάθε πελάτης κάποια στιγµή θα εξυπηρετηθεί Ανάλυση ενός µοντέλου για τη λύση Πόση πληροφορία θα περιέχει το µοντέλο; Υπερβολικά πολλή πληροφορία: η ανάλυση µπορεί να µην είναι εφικτή Υπερβολικά λίγη πληροφορία: η ανάλυση µπορεί να µην είναι ακριβής (vii) Παραδοχές (viii) Εστιαζόµαστε σε µια αφηρηµένη υλοποίηση, σε ένα ιδανικό περιβάλλον εκτέλεσης Αν και η λύση είναι κατάλληλη για n 1 πελάτες, εξετάζουµε την περίπτωση n = 2 Καταστάσεις σ = (p 1, p 2, t 1, t 2 ) S Για κάθε πελάτη, i 1, 2 phase p i idle, trying, critical ticket t i N Αρχική κατάσταση σ 0 : p 1 = p 2 = idle, t 1 = t 2 = 0 17 18 3

(ix) (x) Μετάβαση Step S S όταν (σ, σ') Step γράφουµε Step(σ, σ') (για i =1, οµοίως για i =2) αν p 1 = idle τότε p 1 ' =trying και t 1 ' = t 2 +1 αν p 1 = trying και t 2 = 0 ή t 1 < t 2 αν p 1 = critical τότε p 1 ' =idle και t 1 ' = 0 Ασφάλεια Safe S όταν σ Safe γράφουµε Safe(σ) (p 1 = critical p 2 = critical) Θεώρηµα ασφάλειας Safe(σ 0 ) Safe(σ) Step(σ, σ') Safe(σ') η ιδιότητα Safe είναι αναλλοίωτη (invariant) για τον Bakery Algorithm 19 20 (xi) (xii) Η απόδειξη του παραπάνω θεωρήµατος δυστυχώς δεν είναι δυνατή έστω p 1 = trying, p 2 = critical, t 1 = 1, t 2 = 0 και Safe(σ), Step(σ, σ') αλλά Safe(σ')! Πού βρίσκεται το πρόβληµα; Είναι αδύνατο p 2 = critical χωρίς t 2 >0 Ο αλγόριθµος δε θα φτάσει ποτέ στην κατάσταση σ, όµως αυτό δεν µπορούµε να το εκµεταλλευτούµε κατά την απόδειξη Ασφάλεια (ver2) ExtraSafe S όταν σ ExtraSafe γράφουµε ExtraSafe(σ) (p 1 = critical p 2 = critical) t i = 0 p i = idle Θεώρηµα ασφάλειας (ver2) ExtraSafe(σ 0 ) ExtraSafe(σ) Step(σ, σ') ExtraSafe(σ') 21 22 (xiii) (xiv) Και πάλι η απόδειξη του θεωρήµατος δεν είναι δυνατή έστω p 1 = trying, p 2 = critical, t 1 = 1, t 2 = 2 και ExtraSafe(σ), Step(σ, σ') αλλά ExtraSafe(σ')! Πού βρίσκεται το πρόβληµααυτή τη φορά; Είναι αδύνατο p 2 = critical και t 1 < t 2 Ασφάλεια (ver3) UltraSafe S όταν σ UltraSafe γράφουµε UltraSafe(σ) (p 1 = critical p 2 = critical) t i = 0 p i = idle p i = critical p j = trying t i < t j Θεώρηµα ασφάλειας (ver3) UltraSafe(σ 0 ) UltraSafe(σ) Step(σ, σ') UltraSafe(σ') 23 24 4

(xv) Reset Initial Require Arith Inversion H10 process4b : (p1 : Phase) (t1, t2 : Ticket) Apply Inductive Phase : Set := Split H7 (Process (state p1 t1 critical t2) (state p1 t1 idle O)) Split idle : Phase Split Assumption Decompose [and] H8 trying : Phase Intro Intro Assumption critical : Phase Definition s0 : State := Inversion Decompose Assumption Split H11 [and] Auto H7 (state idle O idle O) Split Cut p1=idle Auto Definition Ticket : Set := Inversion Intro Apply Rewrite Intro H0 H4 -> H10 nat Inductive Reachable : State -> Prop := Intro Compute s Auto Auto Intro Decompose Split Intro [and] H8 Inversion Inversion Intro init : Induction Rewrite s <- H1 in H Assumption H11 H11 Decompose [and] (Reachable s0) Compute Compute Intro in Intro H Inductive State : Set transition := : Intros Decompose Decompose Decompose Apply Compute Inversion H10 [and] [and] H [and] H5 H7 Compute H7 state : Phase -> Ticket (s,-> s' Phase : State) -> Ticket (Reachable -> State s) -> (Process Decompose s Split Inversion Inversion Auto Rewrite s') [and] -> (Reachable H H9 H10 Rewrite <- H2 in H Compute s') in Intro <- H1 in H Apply Intros Compute H H1 Assumption Decompose Compute Compute Compute Decompose Decompose in H [and] H [and] [and] H7 Decompose Inductive Process Definition : State -> safe State :-> State Prop ->:= Prop := Qed Inversion Rewrite Rewrite H9 <-Rewrite Split Inversion [and] H9 H H1 <-in H1 H <-in Split H2 H in H process1a : Compute Compute in Compute Intros Qed H in H in Intros H [s : State] (p2 : Phase) (t1, Cases t2 s : of Ticket) Lemma strong_safe_s0 Split Decompose Decompose Decompose Decompose :[and] [and] H Decompose [and] [and] H H H8 (Process (state (state idle t1 p1 p2 t1 t2) p2 t2) (state => trying (S t2) p2 (strong_safe t2)) Intro Split Split Split Rewrite Lemma -> H10 strong_safet [and] H7 Inversion in H7 s0) process1b : (p2 : Phase) ~(p1 (t1, = critical t2 : Ticket) /\ p2 = critical) Inversion Intro Intro Intros Cut ~(le (S (s t1) : State) H9 t2) (Rea H7 (p1 : Phase) (t1, endt2 : Ticket) Proof Decompose Decompose Decompose Intro [and] [and] H7 Split [and] H7 H8 (Process (state p1 t1 idle t2) (state p1 t1 trying (S Compute t1))) Split Cut p2=idle Cut p1=idle Rewrite Apply -> H12 Proof Auto H11 in H9 process2a : Split Assumption Rewrite Rewrite -> Cut H10 -> ~(le Apply H9 (S H7 Intros t2) t1) (p2 : Phase) Definition (t1 : Ticket) strong_safe : State -> Prop := Intro Intro Intro Intros Auto Induction H Split Apply strong_saf (Process (state [s : trying State] t1 p2 O) (state critical t1 p2 Decompose O)) Split Inversion [and] Inversion Apply H H11 H11 H12 Assumption Apply Apply H9 gt_not_le process2b : Cases s of Inversion Intro H0 (p1 : Phase) (t2 (state : Ticket) p1 t1 p2 t2) => Decompose Apply Apply [and] H4 Auto Unfold gt Apply strong_saf H5 H7 Split Apply lt_s Assumption Coq (Process (state p1 ~(p1 O trying = critical t2) (state /\ p2 = p1 critical) O /\ t2)) Split Inversion Auto Auto H9 Intro Apply Assumption gt_not_le Decompose process3a : (t1 = O -> p1 = idle) /\ Auto Assumption [and] H7 (p2 : Phase) (t1, t2 (t2: = Ticket) O -> p2 = idle) /\ Intro Split Split Unfold gt Inversion (lt t1 t2) -> (p1 = critical /\ p2 = trying -> (lt Split t1 t2)) Auto /\ Intro Assumption Apply Split Qed H9 lt_s (Process (state(p2 trying = critical t1 p2 t2) /\ p1 (state = trying critical -> (lt t1 Auto t2 p2 t1)) t2)) Cut trying=idle Assumption Assumption Intro Theorem safety : process3b : end Compute Intro Split Decompose (p1 : Phase) (t1, t2 : Ticket) Split Rewrite Inversion <-Intro Split Split (s : State) [and] H7 (Rea H1 in H9 H Inversion (lt t2 t1) -> Intro Compute in Cut H trying=idle Intro Intro H10 (Process Lemma (state strong_is_strong p1 t1 trying t2) :(state p1 t1 critical Decompose t2)) Decompose Apply [and] Intro [and] H5 Cut trying=idle Cut trying=idle Proof H H Compute process4a : (s : State) Inversion Split Assumption Inversion Intro Intro Intros H9 Rewrite H0 Inversion Inversion Apply <- H10 H10 strong_is_ H1 in H (p2 : Phase) (t1,(strong_safe t2 : Ticket) s) -> (safe s) Intros Compute Apply in strong_saf H (Process (state critical t1 p2 t2) (state idle O p2 t2)) Intro Decompose Split Apply [and] H4 H7 Decompose [and] H Proof Decompose Inversion Assumption Assumption Apply Apply H6 H5 Assumption [and] H10 Split H Assumption Assumption Qed Intro Inversion H0 Qed Split Split Split Decompose [and] H7 Assumption Intro Intro Split Split 25 Lemma strong_safe_step Decompose Decompose Assumption Intro [and] [and] : H7 H7 li C t Inversion 2 idl H10 5