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.
@@ -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