2. Äàòü explicit èëè implicit îïðåäåëåíèå
ôóíêöèé (âêëþ÷àÿ ñëàáåéøåå ïðåäóñëîâèå), îòâå÷àþùèõ òðåáîâàíèÿì àêñèîì:
type S, E value create : Unit ->
S, add
: E >< S -> S, get : E >< S -> Nat, |
axiom all e : E, s
: S :- get( e, create( ) )
is 0, all e1,e2 :
E, s : S :- get ( e1, add (e2, s)) is if e1 = e2 then
1+get( e1, s ) else get( e1, s ) end, all e1, e2 :
E, n : Nat, s : S :- if n=0 then
add(e2, s ) elsif e1 = e2 then else add(e2, end |
Ðåøåíèå
- ìóëüòèìíîæåñòâî
2. Äàòü ÿâíóþ ñïåöèôèêàöèþ, êîòîðàÿ ìîæåò áûòü óòî÷íåíèåì äàííîé:
type Ñ,A = Nat value create: Unit ->
C, add
: A >< C -> C, |
get
: C -~-> A >< C axiom all e:A, l:C :- get (add(e,l)) is if (e<0) \/ (l=create()) then (e,l) else let (a,b)=get(l) in (a,add(e,b)) end end |
|
|
Ðåøåíèå
type Ñ-list,
A = Nat
value
create: Unit
-> C create() is <..>,
add : A
>< C -> C
add (a,c) is
if (a<0) then a ^ l
else l
^ a end ,
get : C
-~-> A >< C
get
(c) is (hd c, tl c)
pre len c > 0
2. Äàòü explicit èëè implicit îïðåäåëåíèå
ôóíêöèé (âêëþ÷àÿ ñëàáåéøèå ïðåäóñëîâèÿ), îòâå÷àþùèõ òðåáîâàíèÿì àêñèîì:
type S, E value create : Unit ->
S, add2
: S >< E -> S, add3
: E >< S >< E-> S, get
: S -~-> E |
axiom all e1,e2 :
E, s : S :- all e : E, s : S :- all e1,e2 : E, s : S:-
get(add3(e1,s,e2)) is e1, all e : E, s : S :- get(add2(s, e)) is if s=create() then e else get (s) end |
|
|
Ðåøåíèå
add2 ðåàëèçóåò î÷åðåäü, add3 äîáàâëÿåò ýëåìåíò ñ äâóõ ñòîðîí.
2. Äàòü explicit èëè implicit îïðåäåëåíèå ôóíêöèé (âêëþ÷àÿ ñëàáåéøåå ïðåäóñëîâèå), îòâå÷àþùèõ òðåáîâàíèÿì àêñèîì:
type
S, E value create : Unit ->
S, add : E >< S -> S, get : E >< S -> Nat, |
axiom all e : E, s
: S :- get( e, create( ) )
is 0, all e1,e2 :
E, s : S :- get ( e1, add (e2, s)) is if e1 = e2
then 1+get( e1, s ) else
get( e1, s ) end, all e1, e2 :
E, n : Nat, s : S :- if n<=1
then add(e2, s ) elsif e1 = e2 then
else
add(e2, end |
Ðåøåíèå – ìóëüòèìíîæåñòâî, ãäå íå âñå ýëåìåíòû óäàëÿþòñÿ.
2. Äàòü explicit èëè implicit îïðåäåëåíèå ôóíêöèé (âêëþ÷àÿ ñëàáåéøèå ïðåäóñëîâèÿ), îòâå÷àþùèõ òðåáîâàíèÿì àêñèîì:
type S, E value create : Unit ->
S, add1 : S >< E ->
S, add2 : S >< E-> S, get : S -~-> E |
axiom all e : E, s
: S :- add2(s, e) ) is add1(add1(s, e), e) , all e : E, s : S :- all e : E, s : S :- get(add1(s, e)) is if s=create() then e else get (s) end |
Ðåøåíèå: - add1 ðåàëèçóåò î÷åðåäü, add2, ñòàâèò â î÷åðåäü ñðàçó
äâà ýëåìåíòà.
Äàòü explicit èëè implicit îïðåäåëåíèå ôóíêöèé (âêëþ÷àÿ ñëàáåéøåå ïðåäóñëîâèå), îòâå÷àþùèõ òðåáîâàíèÿì àêñèîì:
type
S, E value create : Unit ->
S, add : E >< S -> S, get : E >< S -> Nat, |
axiom all e : E, s
: S :- get( e, create( ) )
is 0, all e1,e2 :
E, s : S :- get ( e1, add (e2, s)) is if e1 = e2
then 1+get( e1, s ) else
get( e1, s ) end, all e1, e2 :
E, n : Nat, s : S :- if n=0
then add(e2, s ) elsif e1 = e2 then
else
add(e2, end |
Ðåøåíèå
- ìóëüòèìíîæåñòâî; ó ôóíêöèè del åñòü ïðåäóñëîâèå – íåëüçÿ èñêëþ÷èòü áîëüøåå êîëè÷åñòâî ýëåìåíòîâ äàííîãî çíà÷åíèÿ, ÷åì èõ èìååòñÿ â ìóëüòèìíîæåñòâå
Îïðåäåëèòü òèïû äàííûõ, äàòü ÿâíóþ ñïåöèôèêàöèþ ôóíêöèé, îïðåäåëèòü ïðåäóñëîâèÿ ÷àñòè÷íî-âû÷èñëèìûõ ôóíêöèé.
type S, E
value
create : Unit -> S,
push_down : E >< S -> S,
push_right : E >< S -> S,
pop_up : S -~-> S,
pop_left : S
-~-> S,
get : S -~-> E,
axiom
all e : E, s : S
:-
pop_up( push_down( e, s ) )
is s,
all e : E, s : S
:-
pop_up( push_right( e, s ) )
is pop_up( s ),
all e : E, s : S
:-
get( push_down( e, s ) ) is e,
all e : E, s : S
:-
get( push_right( e, s ) ) is e,
all e : E, s : S
:-
pop_left(
push_right( e, s ) ) is s
Ðåøåíèå:
type S = L-list, L = E-list, E
value
create : Unit -> S
create () is
<..>,
push_down : E >< S -> S
push_down (e,s)
is <.
<.e.> .>^s,
push_right : E >< S -> S
push_right (e, s) is if
s = <...> then <. <. e.> .>
else <.
<.e.> ^ hd
s .> ^ tl s
end,
pop_up : S -~-> S
pop_up (s) is tl
s
pre s ~= <..>,
pop_left : S
-~-> S
pop_left (s) is
<. tl
hd s .>
^tl s
pre s ~= <..> /\ hd s ~= <..>
(pre s ~= <..> /\ len hd
s > 1) – òîæå âåðíî,
get : S -~-> E
get (s) is hd hd s
pre s ~= <..> /\ hd s ~= <..>
Ðàçðàáîòàòü ñïåöèôèêàöèþ ãðóïïû ôóíêöèé.
Îïðåäåëèòü òèïû äàííûõ è äàòü explicit îïðåäåëåíèå ôóíêöèé add è del, óäîâëåòâîðÿþùèõ ñëåäóþùèì àêñèîìàì. Åñëè íåîáõîäèìî, ñïåöèôèöèðîâàòü ïðåäóñëîâèÿ.
type
S, K, V
value
create : Unit -> S,
add : K >< V >< S -> S,
get : K >< S -~-> V
axiom
all k1,k2 : K, v2
: V, s : S :-
get (k1, add (k2, v2, s)) is if k1 = k2 then
v2
else get( k1, s )
end,
all k1,k2 : K, v2
: V, s : S :-
else add(k2, v2,
end
Ðåøåíèå:
type S = K –m->
V, K, V
value
create : Unit -> S
create () is [ ],
add : K >< V >< S -> S
add (k,v,s) is
s !! [k +> v],
s \ {k}
pre true
Çàäà÷à 2.
Ðàçðàáîòàòü ÿâíóþ ñïåöèôèêàöèþ ãðóïïû ôóíêöèé, óäîâëåòâîðÿþùèõ ñëåäóþùèì àêñèîìàì.
Åñëè íåîáõîäèìî, ñïåöèôèöèðîâàòü ïðåäóñëîâèÿ.
type
S, E
value
create : Unit -> S,
down : E >< S -> S,
right : E >< S -> S,
up : S -~-> S,
left : S -~-> S,
get : S -~-> E
axiom
all e : E, s : S
:-
get(right( e, s ) )
is e,
all e : E, s : S
:-
left(right( e, s ) )
is s,
all e : E, s : S :-
up(down( e, s ) ) is
s,
all e : E, s : S
:-
up(right( e, s ) ) is
up( s ),
all e : E, s : S
:-
get(down( e, s ) ) is
e
Ðåøåíèå:
type S = L-list, L = E-list, E
value
create : Unit -> S
create () is
<..>,
down : E >< S -> S
down (e,s) is <. <.e.> .>^s,
right : E >< S -> S
right (e, s) is if s
= <...> then <. <. e.> .>
else <.
<.e.> ^ hd
s .> ^ tl s
end,
up : S -~-> S
up (s) is tl s
pre s ~= <..>,
left : S -~-> S
left (s) is
<. tl
hd s .>
^tl s
pre s ~= <..> /\ hd s ~= <..>,
get : S -~-> E
get (s) is hd hd s
pre s ~= <..> /\ hd s ~= <..>