fun insert_in_each_set (a, nil) = nil
| insert_in_each_set (a, x::xs) = (a::x)::insert_in_each_set (a, xs);
fun powerset(nil) = [nil]
| powerset(x::xs) =
let
val powersettail = powerset (xs)
in
powersettail@insert_in_each_set (x, powersettail)
end;
val it = [[]] : ?.X1 list list - powerset ([1]); val it = [[],[1]] : int list list - powerset ([1,2]); val it = [[],[2],[1],[1,2]] : int list list - powerset ([1,2,3]); val it = [[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]] : int list list - powerset ([1,2,3,4,5]); val it = [[],[5],[4],[4,5],[3],[3,5],[3,4],[3,4,5],[2],[2,5],[2,4],[2,4,5],...] : int list list
(courtesy [DBCB] Fig. 18.14, p. 937)
(adapted from [OSIDP] Fig. 6.1(b), p. 256)
| T1 | T2 |
| l_1(A) | |
| l_2(A) | |
| r_1(A) | |
| w_1(A) | |
| r_2(A) | |
| w_2(A) | |
| l_1(B) DENIED! | |
| l_2(A) DENIED! |
| Lock requested | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Lock held |
|
| Lock requested | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Lock held |
|