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
127
128
129
130
|
//: Boolean primitives
:(before "End Primitive Recipe Declarations")
AND,
:(before "End Primitive Recipe Numbers")
Recipe_number["and"] = AND;
:(before "End Primitive Recipe Implementations")
case AND: {
bool result = true;
for (index_t i = 0; i < ingredients.size(); ++i) {
assert(ingredients.at(i).size() == 1); // must be a scalar
result = result && ingredients.at(i).at(0);
}
products.resize(1);
products.at(0).push_back(result);
break;
}
:(scenario and)
recipe main [
1:boolean <- copy 1:literal
2:boolean <- copy 0:literal
3:boolean <- and 1:boolean, 2:boolean
]
+run: instruction main/2
+run: ingredient 0 is 1
+mem: location 1 is 1
+run: ingredient 1 is 2
+mem: location 2 is 0
+run: product 0 is 3
+mem: storing 0 in location 3
:(scenario and2)
recipe main [
1:boolean <- and 1:literal, 1:literal
]
+mem: storing 1 in location 1
:(scenario and_multiple)
recipe main [
1:boolean <- and 1:literal, 1:literal, 0:literal
]
+mem: storing 0 in location 1
:(scenario and_multiple2)
recipe main [
1:boolean <- and 1:literal, 1:literal, 1:literal
]
+mem: storing 1 in location 1
:(before "End Primitive Recipe Declarations")
OR,
:(before "End Primitive Recipe Numbers")
Recipe_number["or"] = OR;
:(before "End Primitive Recipe Implementations")
case OR: {
bool result = false;
for (index_t i = 0; i < ingredients.size(); ++i) {
assert(ingredients.at(i).size() == 1); // must be a scalar
result = result || ingredients.at(i).at(0);
}
products.resize(1);
products.at(0).push_back(result);
break;
}
:(scenario or)
recipe main [
1:boolean <- copy 1:literal
2:boolean <- copy 0:literal
3:boolean <- or 1:boolean, 2:boolean
]
+run: instruction main/2
+run: ingredient 0 is 1
+mem: location 1 is 1
+run: ingredient 1 is 2
+mem: location 2 is 0
+run: product 0 is 3
+mem: storing 1 in location 3
:(scenario or2)
recipe main [
1:boolean <- or 0:literal, 0:literal
]
+mem: storing 0 in location 1
:(scenario or_multiple)
recipe main [
1:boolean <- and 0:literal, 0:literal, 0:literal
]
+mem: storing 0 in location 1
:(scenario or_multiple2)
recipe main [
1:boolean <- or 0:literal, 0:literal, 1:literal
]
+mem: storing 1 in location 1
:(before "End Primitive Recipe Declarations")
NOT,
:(before "End Primitive Recipe Numbers")
Recipe_number["not"] = NOT;
:(before "End Primitive Recipe Implementations")
case NOT: {
products.resize(ingredients.size());
for (index_t i = 0; i < ingredients.size(); ++i) {
assert(ingredients.at(i).size() == 1); // must be a scalar
products.at(i).push_back(!ingredients.at(i).at(0));
}
break;
}
:(scenario not)
recipe main [
1:boolean <- copy 1:literal
2:boolean <- not 1:boolean
]
+run: instruction main/1
+run: ingredient 0 is 1
+mem: location 1 is 1
+run: product 0 is 2
+mem: storing 0 in location 2
:(scenario not_multiple)
recipe main [
1:boolean, 2:boolean, 3:boolean <- not 1:literal, 0:literal, 1:literal
]
+mem: storing 0 in location 1
+mem: storing 1 in location 2
+mem: storing 0 in location 3
|