summaryrefslogtreecommitdiffstats
path: root/tp1-files/multiples7.pl
blob: 67e5a063a766e2f853e3958dbc32991565f15dbd (plain)
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
#! /usr/local/bin/perl -w

use strict;
use warnings;

# Tableau des transitions q1→q2
my @transitions;

# Création de l'automate initial
for ( my $q1=0 ; $q1<7 ; $q1++ ) {
    for ( my $i=0 ; $i<10 ; $i++ ) {
	my $q2 = (3*$q1+$i)%7;
	push @{$transitions[$q1][$q2]}, $i;
    }
}

# Transformation des transitions en regexps
for ( my $q1=0 ; $q1<7 ; $q1++ ) {
    for ( my $q2=0 ; $q2<7 ; $q2++ ) {
	my $s = join("",@{$transitions[$q1][$q2]});
	$s = "[$s]" if length($s)>1;
	$transitions[$q1][$q2] = $s;
    }
}

# Élimination des états
for ( my $qelim=6 ; $qelim>=0 ; $qelim-- ) {
    for ( my $q1=0 ; $q1<$qelim ; $q1++ ) {
	for ( my $q2=0 ; $q2<$qelim ; $q2++ ) {
	    my $r12 = $transitions[$q1][$q2];
	    my $r1 = $transitions[$q1][$qelim];
	    my $s = $transitions[$qelim][$qelim];
	    my $r2 = $transitions[$qelim][$q2];
	    $transitions[$q1][$q2] = "(${r12}|${r1}${s}\*${r2})";
	}
    }
}

# Impression de la regexp finale
print "\^" . $transitions[0][0] . "\*\$\n";