1-module(is_rec).
2
3-export([ri1/0, ri11/0, ri13/0, ri14/0, ri2/0, ri3/0, ri4/0, ri5/0,
4         ri6/0, ri7/0, ri8/0]).
5
6-record(r, {f1 :: integer()}).
7
8ri1() ->
9    A = simple1_adt:d1(),
10    is_record(A, r). % opaque term 1
11
12ri11() ->
13    A = simple1_adt:d1(),
14    I = '1-3'(),
15    is_record(A, r, I). % opaque term 1
16
17ri13() ->
18    A = simple1_adt:d1(),
19    if is_record(A, r) -> true end. % breaks the opacity
20
21ri14() ->
22    A = simple1_adt:d1(),
23    if is_record({A, 1}, r) -> true end. % breaks the opacity
24
25-type '1-3-t'() :: 1..3.
26
27-spec '1-3'() -> '1-3-t'().
28
29'1-3'() ->
30    random:uniform(3).
31
32
33-spec 'Atom'() -> atom().
34
35'Atom'() ->
36    a.
37
38ri2() ->
39    A = simple1_adt:d1(),
40    R = 'Atom'(),
41    is_record(A, R). % opaque term 1
42
43ri3() ->
44    A = simple1_adt:d1(),
45    is_record(A, A, 1). % opaque term 2
46
47ri4() ->
48    A = simple1_adt:d1(),
49    is_record(A, hipp:hopp(), 1). % opaque term 1
50
51ri5() ->
52    A = simple1_adt:d1(),
53    is_record(A, A, hipp:hopp()). % opaque term 2
54
55ri6() ->
56    A = simple1_adt:d1(),
57    if is_record(A, r) -> true end. % breaks opacity
58
59ri7() ->
60    A = simple1_adt:d1(),
61    if is_record({r, A}, r) -> true end. % A violates #r{}
62
63ri8() ->
64    A = simple1_adt:d1(),
65    is_record({A, 1}, r). % opaque term 1
66