rlsm 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{README.txt → README} +10 -23
- data/Rakefile +79 -7
- data/ext/array/array_c_ext.c +137 -0
- data/ext/array/extconf.rb +2 -0
- data/ext/binop/binop_c_ext.c +57 -0
- data/ext/binop/extconf.rb +2 -0
- data/ext/monoid/extconf.rb +2 -0
- data/ext/monoid/monoid_c_ext.c +330 -0
- data/lib/rlsm.rb +10 -14
- data/lib/rlsm/binary_operation.rb +151 -0
- data/lib/rlsm/dfa.rb +418 -602
- data/lib/rlsm/helper.rb +12 -0
- data/lib/rlsm/monoid.rb +454 -694
- data/lib/rlsm/regexp.rb +125 -0
- data/lib/rlsm/regexp_parser.rb +450 -0
- data/test/helpers.rb +66 -0
- data/test/test_binop.rb +119 -0
- data/test/test_dfa.rb +435 -0
- data/test/test_monoid.rb +552 -0
- data/test/test_regexp.rb +440 -0
- metadata +109 -37
- data/History.txt +0 -6
- data/Manifest.txt +0 -18
- data/bin/smon +0 -39
- data/data/monoids.db +0 -0
- data/lib/database.rb +0 -95
- data/lib/monkey_patching/array_ext.rb +0 -50
- data/lib/rlsm/re.rb +0 -504
- data/lib/smon/base.rb +0 -284
- data/lib/smon/db.rb +0 -98
- data/lib/smon/dot.rb +0 -65
- data/lib/smon/latex.rb +0 -313
- data/lib/smon/smon.rb +0 -183
- data/stdarb.tex +0 -118
data/test/test_monoid.rb
ADDED
@@ -0,0 +1,552 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helpers')
|
2
|
+
|
3
|
+
require "rlsm/monoid"
|
4
|
+
|
5
|
+
#Create one nontrivial monoid (Transposed transition monoid of {1,2,3})
|
6
|
+
#Make it global for speed reasons
|
7
|
+
$monoid = RLSM::Monoid[ <<MONOID
|
8
|
+
1abcdefghijklmnopqrstuvwxyz
|
9
|
+
aaaaaaaaaaaaaaaaaaaaaaaaaaa
|
10
|
+
baabaaddeaabaabddeiijiijllm
|
11
|
+
caacaaffhaacaacffhrrtrrtxxz
|
12
|
+
dabadeabaijilmlijiabadedaba
|
13
|
+
eabbdedeeijjlmmlmmijjlmmlmm
|
14
|
+
facafhacartrxzxrtracafhfaca
|
15
|
+
gacbfhd1ertsxzyuwvikjoqplnm
|
16
|
+
haccfhfhhrttxzzxzzrttxzzxzz
|
17
|
+
imlljijiieddbaabaaeddbaabaa
|
18
|
+
jmlmjimlmedebabedemlmjijmlm
|
19
|
+
kmlnjipoqed1bacgfhvuwsrtyxz
|
20
|
+
lmmlmmjjimmlmmljjieedeedbba
|
21
|
+
mmmmmmmmmmmmmmmmmmmmmmmmmmm
|
22
|
+
nmmnmmppqmmnmmnppqvvwvvwyyz
|
23
|
+
omnlpqjkivwuyzxstre1dghfbca
|
24
|
+
pmnmpqmnmvwvyzyvwvmnmpqpmnm
|
25
|
+
qmnnpqpqqvwwyzzyzzvwwyzzyzz
|
26
|
+
rzxxtrtrrhffcaacaahffcaacaa
|
27
|
+
szxytrwuvhfgcab1deqopkijnlm
|
28
|
+
tzxztrzxzhfhcachfhzxztrtzxz
|
29
|
+
uzyxwvtsrqponmlkjihgf1edcba
|
30
|
+
vzyywvwvvqppnmmnmmqppnmmnmm
|
31
|
+
wzyzwvzyzqpqnmnqpqzyzwvwzyz
|
32
|
+
xzzxzzttrzzxzzxttrhhfhhfcca
|
33
|
+
yzzyzzwwvzzyzzywwvqqpqqpnnm
|
34
|
+
zzzzzzzzzzzzzzzzzzzzzzzzzzz
|
35
|
+
MONOID
|
36
|
+
]
|
37
|
+
|
38
|
+
context "Creation of a monoid:" do
|
39
|
+
test "Monoid::new : Should accept a valid description." do
|
40
|
+
assert_nothing_raised do
|
41
|
+
RLSM::Monoid[ "012 120 201" ]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
test "Monoid::new : Should require a description." do
|
46
|
+
assert_raises ArgumentError do
|
47
|
+
RLSM::Monoid[]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
test "Monoid::new : Should reject an empty description." do
|
52
|
+
assert_raises ArgumentError do
|
53
|
+
RLSM::Monoid[ "" ]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
test "Monoid::new : Should reject a description with only whitespaces." do
|
58
|
+
assert_raises ArgumentError do
|
59
|
+
RLSM::Monoid[ " \t\n" ]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
test "Monoid::new : Description should describe a quadratic matrix." do
|
64
|
+
assert_raises ParseError do
|
65
|
+
RLSM::Monoid[ "012 120 20" ]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
test "Monoid::new : Described n x n - matrix should contain n symbols." do
|
70
|
+
assert_raises ParseError do
|
71
|
+
RLSM::Monoid[ "123 456 789" ]
|
72
|
+
end
|
73
|
+
|
74
|
+
assert_raises ParseError do
|
75
|
+
RLSM::Monoid[ "000 000 000" ]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
test "Monoid::new : Identity should be first row and column." do
|
80
|
+
assert_raises MonoidError do
|
81
|
+
RLSM::Monoid[ "00 01" ]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
test "Monoid::new : Described monoid should be associative." do
|
86
|
+
assert_raises BinOpError do
|
87
|
+
RLSM::Monoid[ "012 100 200" ]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
test "Monoid::new : Column separators are optional commas." do
|
93
|
+
assert_nothing_raised do
|
94
|
+
RLSM::Monoid[ "0,1,2 1,2,0 2,0,1" ]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
test "Monoid::new : Column seperators must either be used or not in a row." do
|
99
|
+
assert_raises ParseError do
|
100
|
+
RLSM::Monoid[ "0,12 120 201" ]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
test "Monoid::new : Row seperator is whitespaces without leading comma." do
|
105
|
+
assert_nothing_raised do
|
106
|
+
RLSM::Monoid[ "012 \t120\n 201" ]
|
107
|
+
RLSM::Monoid[ "0, 1, 2 1,2,0 2,\t0,1" ]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
context "Multiplication of elements:" do
|
114
|
+
before :each do
|
115
|
+
@monoid = RLSM::Monoid[ "012 120 201" ]
|
116
|
+
end
|
117
|
+
|
118
|
+
test "Monoid#[] : Should require at least two arguments." do
|
119
|
+
assert_raises ArgumentError do
|
120
|
+
@monoid["2"]
|
121
|
+
end
|
122
|
+
|
123
|
+
assert_raises ArgumentError do
|
124
|
+
@monoid[]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
test "Monoid#[] : Should allow arbirtary number >= 2 of arguments" do
|
129
|
+
assert_equal "2", @monoid["0","2"]
|
130
|
+
assert_equal "2", @monoid["1","1"]
|
131
|
+
assert_equal "0", @monoid["1","2"]
|
132
|
+
assert_equal "1", @monoid["0","2", "2"]
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
test "Monoid#[] : Should raise BinOpError for unknown elements." do
|
137
|
+
assert_raises ArgumentError do
|
138
|
+
@monoid["1","3"]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context "Comparsion of two monoids:" do
|
144
|
+
before :each do
|
145
|
+
@m1 = RLSM::Monoid[ "012 120 201" ]
|
146
|
+
@m1_dup = RLSM::Monoid[ "012 120 201" ]
|
147
|
+
@m2 = RLSM::Monoid[ "012 112 212" ]
|
148
|
+
@m2_dup = RLSM::Monoid[ "012 112 212" ]
|
149
|
+
@submon1 = RLSM::Monoid[ "01 11" ]
|
150
|
+
@submon2 = RLSM::Monoid[ "01 10" ]
|
151
|
+
end
|
152
|
+
|
153
|
+
test "Monoid#== : Should check for same binary operation." do
|
154
|
+
assert_equal @m1, @m1
|
155
|
+
assert_equal @m1, @m1_dup
|
156
|
+
refute_equal @m1, @m2
|
157
|
+
end
|
158
|
+
|
159
|
+
test "Monoid#== : Should check for Object type." do
|
160
|
+
refute_equal @m1, :some_other_thing
|
161
|
+
end
|
162
|
+
|
163
|
+
test "Monoid#< : Should recognize proper submonoids." do
|
164
|
+
assert @submon1 < @m2
|
165
|
+
refute @submon2 < @m2
|
166
|
+
assert RLSM::Monoid[ "0" ] < @m2
|
167
|
+
refute @m2 < @m2_dup
|
168
|
+
end
|
169
|
+
|
170
|
+
test "Monoid#<= : Should recognize all kind of submonoids" do
|
171
|
+
assert @m1 <= @m1_dup
|
172
|
+
assert @submon1 <= @m2
|
173
|
+
refute @submon2 <= @m2
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "Generating submonoids:" do
|
178
|
+
test "Monoid#generated_set : Should require an argument." do
|
179
|
+
m1 = RLSM::Monoid[ "0123 1203 2013 3333" ]
|
180
|
+
|
181
|
+
assert_raises ArgumentError do
|
182
|
+
m1.generated_set
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
test "Monoid#generated_set : Empty set should generate identity singleton." do
|
187
|
+
m1 = RLSM::Monoid[ "0123 1203 2013 3333" ]
|
188
|
+
|
189
|
+
assert_equal ["0"], m1.generated_set([])
|
190
|
+
end
|
191
|
+
|
192
|
+
test "Monoid#generated_set : Should generate smallest closed subset." do
|
193
|
+
m1 = RLSM::Monoid[ "0123 1203 2013 3333" ]
|
194
|
+
|
195
|
+
assert_equal ["0"], m1.generated_set(["0"])
|
196
|
+
assert_equal ["0","3"], m1.generated_set(["3"])
|
197
|
+
assert_equal ["0","1","2"], m1.generated_set(["1"])
|
198
|
+
assert_equal ["0","1","2","3"], m1.generated_set(["1","3"])
|
199
|
+
end
|
200
|
+
|
201
|
+
test "Monoid#generated_set : Should raise BinOpError for unknown elements." do
|
202
|
+
m1 = RLSM::Monoid[ "0123 1203 2013 3333" ]
|
203
|
+
|
204
|
+
assert_raises ArgumentError do
|
205
|
+
m1.generated_set(["4"])
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
test "Monoid#generated_set : Should order result according to base monoid" do
|
210
|
+
m1 = RLSM::Monoid[ "e103 10e3 0e13 3333" ]
|
211
|
+
|
212
|
+
assert_equal ["e","3"], m1.generated_set(["3"])
|
213
|
+
assert_equal ["e","1","0"], m1.generated_set(["1"])
|
214
|
+
assert_equal ["e","1","0","3"], m1.generated_set(["1","3"])
|
215
|
+
end
|
216
|
+
|
217
|
+
test "Submonoid generated by a set" do
|
218
|
+
m1 = RLSM::Monoid[ "e103 10e3 0e13 3333" ]
|
219
|
+
|
220
|
+
assert_equal RLSM::Monoid["e3 33"], m1.get_submonoid(["3"])
|
221
|
+
end
|
222
|
+
|
223
|
+
test "Listing of all submonoids." do
|
224
|
+
m1 = RLSM::Monoid[ "e103 10e3 0e13 3333" ]
|
225
|
+
|
226
|
+
asserted = [RLSM::Monoid[ 'e' ],
|
227
|
+
RLSM::Monoid[ 'e3 33' ],
|
228
|
+
RLSM::Monoid[ 'e10 10e 0e1' ],
|
229
|
+
RLSM::Monoid[ 'e103 10e3 0e13 3333' ]]
|
230
|
+
|
231
|
+
assert_equal asserted, m1.submonoids
|
232
|
+
end
|
233
|
+
|
234
|
+
test "Listing of all proper submonoids." do
|
235
|
+
m1 = RLSM::Monoid[ "e103 10e3 0e13 3333" ]
|
236
|
+
|
237
|
+
asserted = [RLSM::Monoid[ 'e3 33' ],
|
238
|
+
RLSM::Monoid[ 'e10 10e 0e1' ]]
|
239
|
+
|
240
|
+
assert_equal asserted, m1.proper_submonoids
|
241
|
+
end
|
242
|
+
|
243
|
+
test "Calculation of a generating subset." do
|
244
|
+
m1 = RLSM::Monoid[ "e103 10e3 0e13 3333" ]
|
245
|
+
|
246
|
+
assert_equal ['1','3'], m1.generating_subset
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
context "Isomorphism and Antiisomorphism" do
|
251
|
+
test "Isomorphism of two monoids." do
|
252
|
+
m1 = RLSM::Monoid[ "012 112 212" ]
|
253
|
+
m2 = RLSM::Monoid[ "abc bbc cbc" ]
|
254
|
+
m3 = RLSM::Monoid[ "012 120 201" ]
|
255
|
+
|
256
|
+
assert m1 =~ m2
|
257
|
+
assert m2 =~ m1
|
258
|
+
refute m1 =~ m3
|
259
|
+
refute m2 =~ m3
|
260
|
+
end
|
261
|
+
|
262
|
+
test "Antiisomorphism of two monoids." do
|
263
|
+
m1 = RLSM::Monoid[ "012 112 212" ]
|
264
|
+
m2 = RLSM::Monoid[ "abc bbb ccc" ]
|
265
|
+
|
266
|
+
assert m1.antiisomorph?(m2)
|
267
|
+
assert m2.antiisomorph?(m1)
|
268
|
+
refute m1.antiisomorph?(m1)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
context "Properties of an element" do
|
273
|
+
test "Order of an element." do
|
274
|
+
m1 = RLSM::Monoid[ "012 120 201" ]
|
275
|
+
|
276
|
+
assert_equal 1, m1.order_of('0')
|
277
|
+
assert_equal 3, m1.order_of('1')
|
278
|
+
end
|
279
|
+
|
280
|
+
test "Left ideal of an element." do
|
281
|
+
m1 = RLSM::Monoid[ "012 120 201" ]
|
282
|
+
m2 = RLSM::Monoid[ "012 112 222" ]
|
283
|
+
m3 = RLSM::Monoid[ "012 112 212" ]
|
284
|
+
|
285
|
+
assert_equal ['0','1','2'], m1.left_ideal('0')
|
286
|
+
assert_equal ['0','1','2'], m1.left_ideal('1')
|
287
|
+
assert_equal ['1','2'], m2.left_ideal('1')
|
288
|
+
assert_equal ['2'], m2.left_ideal('2')
|
289
|
+
assert_equal ['2'], m3.left_ideal('2')
|
290
|
+
end
|
291
|
+
|
292
|
+
test "Right ideal of an element." do
|
293
|
+
m1 = RLSM::Monoid[ "012 120 201" ]
|
294
|
+
m2 = RLSM::Monoid[ "012 112 222" ]
|
295
|
+
m3 = RLSM::Monoid[ "012 112 212" ]
|
296
|
+
|
297
|
+
assert_equal ['0','1','2'], m1.right_ideal('0')
|
298
|
+
assert_equal ['0','1','2'], m1.right_ideal('1')
|
299
|
+
assert_equal ['1','2'], m2.right_ideal('1')
|
300
|
+
assert_equal ['2'], m2.right_ideal('2')
|
301
|
+
assert_equal ['1','2'], m3.right_ideal('2')
|
302
|
+
end
|
303
|
+
|
304
|
+
test "Ideal of an element." do
|
305
|
+
m1 = RLSM::Monoid[ "012 120 201" ]
|
306
|
+
m2 = RLSM::Monoid[ "012 112 222" ]
|
307
|
+
m3 = RLSM::Monoid[ "012 112 212" ]
|
308
|
+
|
309
|
+
assert_equal ['0','1','2'], m1.ideal('0')
|
310
|
+
assert_equal ['0','1','2'], m1.ideal('1')
|
311
|
+
assert_equal ['1','2'], m2.ideal('1')
|
312
|
+
assert_equal ['2'], m2.ideal('2')
|
313
|
+
assert_equal ['1','2'], m3.ideal('2')
|
314
|
+
end
|
315
|
+
|
316
|
+
test "Idempotence of an element." do
|
317
|
+
m1 = RLSM::Monoid[ "012 120 201" ]
|
318
|
+
m2 = RLSM::Monoid[ "012 102 222" ]
|
319
|
+
|
320
|
+
assert m1.idempotent?('0')
|
321
|
+
assert m2.idempotent?('2')
|
322
|
+
refute m1.idempotent?('1')
|
323
|
+
end
|
324
|
+
|
325
|
+
test "Neutral element." do
|
326
|
+
m1 = RLSM::Monoid[ "01 11" ]
|
327
|
+
|
328
|
+
assert m1.identity?('0')
|
329
|
+
refute m1.identity?('1')
|
330
|
+
|
331
|
+
assert_equal '0', m1.identity
|
332
|
+
end
|
333
|
+
|
334
|
+
test "Zero element." do
|
335
|
+
m0 = RLSM::Monoid[ '0' ]
|
336
|
+
m1 = RLSM::Monoid[ "01 11" ]
|
337
|
+
|
338
|
+
assert m1.zero?('1')
|
339
|
+
refute m1.zero?('0')
|
340
|
+
refute m0.zero?('0')
|
341
|
+
|
342
|
+
assert_nil m0.zero
|
343
|
+
assert_equal '1', m1.zero
|
344
|
+
end
|
345
|
+
|
346
|
+
test "Left zeros." do
|
347
|
+
m0 = RLSM::Monoid[ '0' ]
|
348
|
+
m1 = RLSM::Monoid[ "012 111 222" ]
|
349
|
+
m2 = RLSM::Monoid[ "012 112 212" ]
|
350
|
+
|
351
|
+
assert m1.left_zero?('1')
|
352
|
+
refute m2.left_zero?('1')
|
353
|
+
refute m0.zero?('0')
|
354
|
+
end
|
355
|
+
|
356
|
+
test "Right zeros." do
|
357
|
+
m0 = RLSM::Monoid[ '0' ]
|
358
|
+
m1 = RLSM::Monoid[ "012 111 222" ]
|
359
|
+
m2 = RLSM::Monoid[ "012 112 212" ]
|
360
|
+
|
361
|
+
assert m2.right_zero?('1')
|
362
|
+
refute m1.right_zero?('1')
|
363
|
+
refute m0.zero?('0')
|
364
|
+
end
|
365
|
+
|
366
|
+
test "Set of all idempotents" do
|
367
|
+
m1 = RLSM::Monoid[ "e10 111 000" ]
|
368
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
369
|
+
|
370
|
+
assert_equal ['0'], m2.idempotents
|
371
|
+
assert_equal ['e','1','0'], m1.idempotents
|
372
|
+
end
|
373
|
+
|
374
|
+
test "Set of all left zeros" do
|
375
|
+
m1 = RLSM::Monoid[ "e10 111 000" ]
|
376
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
377
|
+
m3 = RLSM::Monoid[ "012 102 222" ]
|
378
|
+
|
379
|
+
assert_equal ['2'], m3.left_zeros
|
380
|
+
assert_equal [], m2.left_zeros
|
381
|
+
assert_equal ['1','0'], m1.left_zeros
|
382
|
+
end
|
383
|
+
|
384
|
+
test "Set of all right zeros" do
|
385
|
+
m1 = RLSM::Monoid[ "e10 110 010" ]
|
386
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
387
|
+
m3 = RLSM::Monoid[ "012 102 222" ]
|
388
|
+
|
389
|
+
assert_equal ['2'], m3.right_zeros
|
390
|
+
assert_equal [], m2.right_zeros
|
391
|
+
assert_equal ['1','0'], m1.right_zeros
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
context "Green Relations" do
|
396
|
+
test "L-Relation" do
|
397
|
+
assert_equal ['a','m','z'], $monoid.l_class('a')
|
398
|
+
assert_equal ['d','f','j','p','t','w'], $monoid.l_class('d')
|
399
|
+
assert_equal ['1','g','k','o','s','u'], $monoid.l_class('u')
|
400
|
+
end
|
401
|
+
|
402
|
+
test "R-Relation" do
|
403
|
+
assert_equal ['a',], $monoid.r_class('a')
|
404
|
+
assert_equal ['b','d','e','i','j','l'], $monoid.r_class('d')
|
405
|
+
assert_equal ['1','g','k','o','s','u'], $monoid.r_class('u')
|
406
|
+
end
|
407
|
+
|
408
|
+
test "J-Relation" do
|
409
|
+
assert_equal ['a','m','z'], $monoid.j_class('a')
|
410
|
+
assert_equal(['b','c','d','e','f','h','i','j','l',
|
411
|
+
'n','p','q','r','t','v','w','x','y'], $monoid.j_class('d'))
|
412
|
+
assert_equal ['1','g','k','o','s','u'], $monoid.j_class('u')
|
413
|
+
end
|
414
|
+
|
415
|
+
test "H-Relation" do
|
416
|
+
assert_equal ['a'], $monoid.h_class('a')
|
417
|
+
assert_equal ['d','j'], $monoid.h_class('d')
|
418
|
+
assert_equal ['1','g','k','o','s','u'], $monoid.h_class('u')
|
419
|
+
end
|
420
|
+
|
421
|
+
test "Listing of all classes of a type" do
|
422
|
+
assert_equal([%w(a m z),
|
423
|
+
%w(1 g k o s u),
|
424
|
+
%w(b c d e f h i j l n p q r t v w x y)],
|
425
|
+
$monoid.j_classes)
|
426
|
+
|
427
|
+
assert_equal([%w(a m z),
|
428
|
+
%w(1 g k o s u),
|
429
|
+
%w(b c l n x y),
|
430
|
+
%w(d f j p t w),
|
431
|
+
%w(e h i q r v)],
|
432
|
+
$monoid.l_classes)
|
433
|
+
|
434
|
+
assert_equal([%w(a), %w(m), %w(z),
|
435
|
+
%w(1 g k o s u),
|
436
|
+
%w(b d e i j l),
|
437
|
+
%w(c f h r t x),
|
438
|
+
%w(n p q v w y)],
|
439
|
+
$monoid.r_classes)
|
440
|
+
|
441
|
+
assert_equal([%w(a), %w(m), %w(z),
|
442
|
+
%w(b l), %w(c x), %w(d j),
|
443
|
+
%w(e i), %w(f t), %w(h r),
|
444
|
+
%w(n y), %w(p w), %w(q v),
|
445
|
+
%w(1 g k o s u)],
|
446
|
+
$monoid.h_classes)
|
447
|
+
end
|
448
|
+
|
449
|
+
test "Triviality of a type"
|
450
|
+
end
|
451
|
+
|
452
|
+
context "Properties of a monoid" do
|
453
|
+
test "Idempotence of a monoid." do
|
454
|
+
m1 = RLSM::Monoid[ "e10 110 010" ]
|
455
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
456
|
+
|
457
|
+
assert m1.idempotent?
|
458
|
+
refute m2.idempotent?
|
459
|
+
end
|
460
|
+
|
461
|
+
test "Commutativity." do
|
462
|
+
m1 = RLSM::Monoid[ "e10 110 010" ]
|
463
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
464
|
+
|
465
|
+
assert m2.commutative?
|
466
|
+
refute m1.commutative?
|
467
|
+
end
|
468
|
+
|
469
|
+
test "With zero?" do
|
470
|
+
m1 = RLSM::Monoid[ "e10 110 000" ]
|
471
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
472
|
+
|
473
|
+
assert m1.zero?
|
474
|
+
refute m2.zero?
|
475
|
+
end
|
476
|
+
|
477
|
+
test "Group?" do
|
478
|
+
m1 = RLSM::Monoid[ "e10 110 010" ]
|
479
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
480
|
+
|
481
|
+
|
482
|
+
assert m2.group?
|
483
|
+
refute m1.group?
|
484
|
+
end
|
485
|
+
|
486
|
+
test "Monogenic?" do
|
487
|
+
m1 = RLSM::Monoid[ "e10 110 010" ]
|
488
|
+
m2 = RLSM::Monoid[ "012 120 201" ]
|
489
|
+
|
490
|
+
assert m2.monogenic?
|
491
|
+
refute m1.monogenic?
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
context "Syntactical properties of a monoid" do
|
496
|
+
test "Decide syntacticity of a monoid" do
|
497
|
+
m1 = RLSM::Monoid[ '012 112 212' ]
|
498
|
+
m2 = RLSM::Monoid[ '0123 1111 2111 3111' ]
|
499
|
+
|
500
|
+
assert m1.syntactic?
|
501
|
+
refute m2.syntactic?
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
context "Iterator: " do
|
506
|
+
test "MonoidIterator" do
|
507
|
+
i = 0
|
508
|
+
RLSM::Monoid.each(3) { i += 1 }
|
509
|
+
|
510
|
+
assert_equal 6, i
|
511
|
+
|
512
|
+
i = 0
|
513
|
+
RLSM::Monoid.each(4) { i += 1 }
|
514
|
+
|
515
|
+
assert_equal 27, i
|
516
|
+
|
517
|
+
i = 0
|
518
|
+
RLSM::Monoid.each(5) { i += 1 }
|
519
|
+
|
520
|
+
assert_equal 156, i
|
521
|
+
|
522
|
+
order4 = [RLSM::Monoid[ '0123 1032 2301 3210' ],
|
523
|
+
RLSM::Monoid[ '0123 1032 2310 3201' ],
|
524
|
+
RLSM::Monoid[ '0123 1023 2222 3322' ],
|
525
|
+
RLSM::Monoid[ '0123 1023 2223 3332' ],
|
526
|
+
RLSM::Monoid[ '0123 1032 2323 3232' ],
|
527
|
+
RLSM::Monoid[ '0123 1023 2222 3323' ],
|
528
|
+
RLSM::Monoid[ '0123 1023 2222 3333' ],
|
529
|
+
RLSM::Monoid[ '0123 1023 2323 3223' ],
|
530
|
+
RLSM::Monoid[ '0123 1111 2111 3111' ],
|
531
|
+
RLSM::Monoid[ '0123 1113 2113 3331' ],
|
532
|
+
RLSM::Monoid[ '0123 1122 2211 3211' ],
|
533
|
+
RLSM::Monoid[ '0123 1111 2111 3112' ],
|
534
|
+
RLSM::Monoid[ '0123 1111 2111 3113' ],
|
535
|
+
RLSM::Monoid[ '0123 1111 2111 3123' ],
|
536
|
+
RLSM::Monoid[ '0123 1111 2111 3333' ],
|
537
|
+
RLSM::Monoid[ '0123 1111 2112 3123' ],
|
538
|
+
RLSM::Monoid[ '0123 1113 2113 3333' ],
|
539
|
+
RLSM::Monoid[ '0123 1121 2212 3123' ],
|
540
|
+
RLSM::Monoid[ '0123 1123 2213 3333' ],
|
541
|
+
RLSM::Monoid[ '0123 1111 2121 3113' ],
|
542
|
+
RLSM::Monoid[ '0123 1111 2121 3333' ],
|
543
|
+
RLSM::Monoid[ '0123 1111 2122 3123' ],
|
544
|
+
RLSM::Monoid[ '0123 1111 2122 3133' ],
|
545
|
+
RLSM::Monoid[ '0123 1111 2123 3333' ],
|
546
|
+
RLSM::Monoid[ '0123 1111 2222 3333' ],
|
547
|
+
RLSM::Monoid[ '0123 1111 2130 3102' ],
|
548
|
+
RLSM::Monoid['0123 1123 2231 3312']]
|
549
|
+
|
550
|
+
RLSM::Monoid.each(4) { |m| assert order4.include? m }
|
551
|
+
end
|
552
|
+
end
|