1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| MACHINE
Mach1
SETS
DATAS
CONSTANTS
NoEl,MAX_SIZE
PROPERTIES
NoEl : DATAS &
MAX_SIZE : NAT1
VARIABLES
pile
INVARIANT
pile : seq(DATAS)
INITIALISATION
pile := []
OPERATIONS
nStatus <-- WRITE_TO(el) =
PRE
el : DATAS
THEN
SELECT size(pile)=MAX_SIZE THEN
nStatus := FALSE
ELSE
nStatus := TRUE ||
pile := pile<-el
END
END;
nStatus,nEl <-- READ_FROM =
BEGIN
SELECT size(pile) = 0 THEN
nStatus := FALSE ||
nEl :: DATAS
ELSE
nStatus := TRUE ||
nEl := first(pile) ||
pile := tail(pile)
END
END;
nSize <-- GET_SIZE =
BEGIN
nSize := size(pile)
END
END
REFINEMENT Mach1_r
REFINES Mach1
DEFINITIONS
MAX_ARR == (MAX_SIZE+1)
VARIABLES
arr_vrb,p_read,p_write
INVARIANT
arr_vrb : 0..MAX_ARR --> DATAS &
p_read : 1..MAX_ARR &
p_write : 1..MAX_ARR &
((p_write>=p_read)=>(p_write-p_read = size(pile))) &
((p_write>=p_read)=>(p_read..p_write-1)<|arr_vrb=pile) &
((p_write<p_read)=>(MAX_ARR-p_read+p_write=size(pile))) &
((p_write<p_read & p_write=1)=>(((p_read..MAX_ARR)<|arr_vrb))=pile) &
((p_write<p_read & p_write/=1)=>(((p_read..MAX_ARR)<|arr_vrb) \/ ((1..p_write-1)<|arr_vrb))=pile)
INITIALISATION
arr_vrb := (0..MAX_ARR) * {NoEl} ||
p_read := 1 ||
p_write := 1
OPERATIONS
nStatus <-- WRITE_TO(el) =
PRE
el : DATAS
THEN
SELECT p_write=MAX_ARR THEN
SELECT p_read = 1 THEN
nStatus := FALSE
ELSE
nStatus := TRUE ||
arr_vrb(p_write):=el||
p_write := 1
END
ELSE
SELECT p_write+1 /= p_read THEN
nStatus := TRUE ||
arr_vrb(p_write):=el||
p_write := p_write + 1
ELSE
nStatus := FALSE
END
END
END;
nStatus,nEl <-- READ_FROM =
BEGIN
SELECT p_read=MAX_ARR THEN
SELECT p_write = MAX_ARR THEN
nStatus := FALSE ||
nEl := NoEl
ELSE
nStatus := TRUE ||
nEl := arr_vrb(p_read)||
p_read := 1
END
ELSE
SELECT p_read /= p_write THEN
nStatus := TRUE ||
nEl := arr_vrb(p_read)||
p_read := p_read + 1
ELSE
nStatus := FALSE ||
nEl := NoEl
END
END
END;
nSize <-- GET_SIZE =
BEGIN
SELECT p_write>=p_read THEN
nSize := p_write-p_read
ELSE
nSize := MAX_ARR - p_read + p_write
END
END
END |
Partager