![]() | ![]() |
|
|
Esercitazione settima
Questa esercitazione è strutturata in tre parti :
Codifica in Pascal di una grammatica che generi stringhe del tipo akblcm con i valori di k, l, m variabili tra 1 e 20 .In particolare questa grammatica è del tipo
G = ( , , P, S }
P =
Poiché i valori di k, l ed 252b11c m non dovevano seguire uno schema preciso, è stata usata la funzione Randomize per avere valori variabili ;
Codifica in Pascal di una grammatica che generi stringhe del tipo albkck e del tipo akbkcl con valori di k, l ed m variabili tra 1 e 20. In particolare questa grammatica è del tipo :
G = ( , , P, S )
P =
Codifica in Pascal di una grammatica che generi stringhe del tipo anbncn con n variabile fra 1 e 20 ; in particolare questa grammatica è del tipo :
G = ( , , P, S )
P=
Programma Grammatica a k b l c m ( VII )nnnnmnnnnnnn
Program gram1 ;
uses crt ;
type vettore =array [ 1..63 ] of char ;
type vetbool = array [ 1..20 ] of boolean ;
var v, t ,y : vettore ;
var z : vetbool ;
var i, n, w, q, k, x : integer ;
const a = char ( ' a ' ) ;
const b = char ( ' b ' ) ;
const c = char ( ' c ' ) ;
const F = char ( ' A ' ) ;
const D = char ( ' B ' ) ;
const G = char ( ' C ' ) ;
const S = char ( ' S ' ) ;
Procedure produzione ( var v : vettore ; var k :integer ) ;
var i, n, z, w : integer ;
Begin
v [ 1 ] := S ;
if v [ 1 ] = S then begin
v [ 1 ] := F ;
v [ 2 ] := D ;
v [ 3 ] := G ;
end ;
n := Random ( 20 ) +1 ;
for i := 1 to n do begin
if i < > n then begin
if v [ i ] = F then begin
v [ i+3 ] := v [ i+2 ] ;
v [ i+2 ] := v [ i+1 ] ;
v [ i+1 ] := v [ i ] ;
v [ i ] := a ;
end ;
end
else if v [ i ] = F then v [ i ] := a ;
end ;
z := Random ( 20 ) +1 ;
for i := n+1 to n +z do begin
if i <> ( n + z ) then begin
if v [ i ] = D then begin
v [ i+2 ] := v [ i+1 ] ;
v [ i+1 ] := v [ i ] ;
v [ i ] := b ;
end ;
end
else if v [ i ] = D then v [ i ] := b ;
end ;
w := Random ( 20 ) +1 ;
for i := n + z + 1 to w + n + z do begin
if i <> ( w + n + z ) then begin
if v [ i ] = G then begin
v [ i+1 ] := v [ i ] ;
v [ i ] := c ;
end ;
end
else if v [ i ] = G then v [ i ] := c ;
end ;
k := w + n + z ;
for i := 1 to k do write ( v [ i ] ) ;
writeln
end
Function amb ( t, y :vettore): boolean ;
var i, c : integer ;
begin
c := 0 ;
for i := 1 to 59 do if t [ i ] = y [ i ] then c := c+1 ;
if c = 59 then amb := True else amb := False ;
end
Begin
v [ 1 ] := S ;
for i := 1 to 10 do begin
produzione ( v, k ) ;
for x := 1 to k do begin
t [ x ] := v [ x ] ;
write ( t [ x ] ) ;
end ;
writeln ( ' ) ;
produzione ( v, k ) ;
for x := 1 to k do begin
y [ x ] := v [ x ] ;
write ( y [ x ] ) ;
end ;
writeln (' ) ;
z [ i ] := amb ( t, y ) ;
i := i+1 ;
end;
for i:=1 to 20 do begin
if z[ i ] = true then writeln ( 'La grammatica è ambigua ' )
else writeln ( 'La grammatica non è ambigua' ) ;
end ;
readln
end
Dimostrazione pratica
Output :
abccccc
aaaaaaaaabbbbbbbc
aaaaaaabbbbbbbbbbc
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbccccccccccccccc
aaaabbbbbbbbbbbbbbbbbbbcc
aaaaaaaaaaaaaaaaaabbbbbbbbbbbcccccccccccccccccccccccccccc
aaaaaaabbbbbbbbbbbbbbbbbbbbbbccccccccccccccc
abc
aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbcc
aaaaaaabbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccc
aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbccccccccccc
aaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccc
abbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccc
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbcccccccccccccccc
aaabbbc
aaaaaabc
aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbccccc
aaaaaaaaaabbcccccccc
abbbbbbbbbccccccccccccccccccccccccccccccccccc
aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbc
La grammatica non è ambigua
Programma Grammatica al bk ck ed ak bk cl ( VI bis )
Program Gram2;
uses crt;
type vettore =array [1..59] of char ;
type vet =array [1..20] of boolean ;
var v1,v2,y,t : vettore ;
var x :vet ;
var i, z, q :integer ;
const a = char ( 'a' ) ;
const b = char ( 'b' ) ;
const c = char ( 'c' ) ;
const S = char ( 'S' ) ;
const F = char ( 'A' ) ;
const G = char ( 'C' ) ;
const D = char ( 'D' ) ;
const E = char ( 'E' ) ;
Procedure produzione1 ( n :integer ;var v :vettore ;var z :integer );
var i, q : integer ;
Begin
v1 [ 1 ] := F ;
v1 [ 2 ] := E ;
if n =1 then begin
if v1 [ n ]= F then v1 [ n ] :=a ;
if v1 [ n+1 ]= E then begin
v1 [ n+1 ] :=b ;
v1 [ n+2 ] :=c ;
end ;
end
else if n = 2 then begin
if v1 [ 1 ] = F then v1 [ 1 ] := a ;
if v1 [ 2 ] = E then begin
v1 [ n+2 ] := c ;
v1 [ n+1 ] := E ;
v1 [ n ] := b ;
end ;
for i:= 1 to 59 do begin
if v1 [ i ] = E then begin
v1 [ i+2 ] := v1 [ i+1 ] ;
v1 [ i+1 ] := c ;
v1 [ i ] := b ;
end ;
end;
end
else begin
for i := 1 to ( n-1 ) do begin
if i < > ( n-1 ) then begin
if v1 [ i ] = F then begin
v1 [ i+2 ] := v1 [ i+1 ] ;
v1 [ i+1 ] := v1 [ i ] ;
v1 [ i ] := a ;
end ;
end
else if v1 [ i ] = F then v1 [ i ] := a ;
end ;
q :=2 ;
for i := n to ( n+z ) do begin
if i <> ( n+z ) then begin
if v1 [ i ] = E then begin
if v1 [ i+1 ] = c then begin
v1 [ i+q ] := v1 [ i+1 ] ;
v1 [ i+q-1 ] := c ;
v1 [ i+1 ] := v1 [ i ] ;
v1 [ i ] := b ;
q := q+1 ;
end
else begin
v1 [ i+q ] := c ;
v1 [ i+1 ] := v1 [ i ] ;
v1 [ i ] := b ;
q := q+1 ;
end ;
end;
end
else begin
v1 [ i+q-1 ] := c ;
v1 [ i+1 ] := c ;
v1 [ i ] := b ;
q := q+1 ;
end ;
end ;
end ;
for i:=1 to 59 do write ( v1 [ i ] ) ;
writeln (' );
end
Procedure produzione2 ( n: integer; var v2 :vettore; var z :integer );
var i, q :integer ;
Begin
v2 [ 1 ] := D ;
v2[ 2 ] := G ;
if n = 1 then begin
if v2 [ n+1 ] = G then v2 [ n+2 ] :=c ;
if v2 [ n ] = D then begin
v2 [ n ] := a ;
v2 [ n+1 ] := b ;
end ;
end
else if n = 2 then begin
if v2 [ n ] = G then v2 [ n+2 ] := c ;
if v2 [ n-1 ] =D then begin
v2 [ n+1 ] := b ;
v2 [ n ] := v2 [ n-1 ] ;
v2 [ n-1 ] := a ;
end ;
for i:= 1 to 59 do begin
if v2 [ i ] =D then begin
v2 [ i+3 ] :=v2 [ i+2 ] ;
v2 [ i+2 ] :=v2 [ i+1 ] ;
v2 [ i ] :=a ;
end ;
end ;
end
else begin
q := 3 ;
for i := 1 to n do begin
if i <> n then begin
if v2 [ i ] = D then begin
if v2 [ i+1 ] = b then begin
v2 [ i+q ] := v2 [i+q-2 ] ;
v2 [ i+q-2 ] := b ;
v2 [ i+q-1 ] := v2 [ i+1 ] ;
v2 [ i+1 ] := v2 [ i ] ;
v2 [ i ] := a ;
q := q+1 ;
end
else begin
v2 [ i+q ] := v2 [ i+1 ] ;
v2 [ i+q-1 ] := b ;
v2 [ i+1 ] := v2 [ i ] ;
v2 [ i ] := a ;
q := q+1 ;
end ;
end ;
end
else begin
if v2 [ i ] = D then begin
v2 [ i+q-1 ] := v2 [ i+q-2 ] ;
v2 [ i+q-2 ] := b ;
v2 [ i+1 ] := b ;
v2 [ i ] := a ;
q := q+1 ;
end ;
end ;
end ;
for i := ( ( n*2 ) +1 ) to ( ( n*2 ) +z ) do begin
if i < > ( ( n*2 ) +z ) then begin
if v2 [ i ] =G then begin
v2 [ i+1 ]:= v2 [ i ] ;
v2 [ i ] := c ;
end ;
end
else if v2 [ i ] = G then v2 [ i ] := c ;
end ;
end ;
for i:=1 to 59 do write ( v2 [ i ] ) ;
writeln (' );
end
Function amb ( var v1,v2 : vettore ): boolean ;
var i, c: integer ;
begin
c := 0 ;
for i :=1 to 59 do if v1 [ i ] = v2 [ i ] then c := c+1 ;
if c =59 then amb := True else amb := False ;
end
begin
clrscr
v1 [ 1 ] := S ;
v2 [ 1 ] := S ;
z := 0 ;
for i := 1 to 20 do begin
produzione1 ( i, v1, z ) ;
produzione2 ( i, v2, z ) ;
z := z+1 ;
x [ i ] := amb ( y, t ) ;
end ;
for i:=1 to 20 do begin
if x [ i ] = true then writeln ( 'La grammatica è ambigua ' )
else writeln ( ' La grammatica non è ambigua ' ) ;
end ;
readln
end
Dimostrazione pratica
Output :
abc
abc
abbcc
aabbc
aabbbccc
aaabbbcc
aaabbbbcccc
aaaabbbbccc
aaaabbbbbccccc
aaaaabbbbbcccc
aaaaabbbbbbcccccc
aaaaaabbbbbbccccc
aaaaaabbbbbbbccccccc
aaaaaaabbbbbbbcccccc
aaaaaaabbbbbbbbcccccccc
aaaaaaaabbbbbbbbccccccc
aaaaaaaabbbbbbbbbccccccccc
aaaaaaaaabbbbbbbbbcccccccc
aaaaaaaaabbbbbbbbbbcccccccccc
aaaaaaaaaabbbbbbbbbbccccccccc
aaaaaaaaaabbbbbbbbbbbccccccccccc
aaaaaaaaaaabbbbbbbbbbbcccccccccc
aaaaaaaaaaabbbbbbbbbbbbcccccccccccc
aaaaaaaaaaaabbbbbbbbbbbbccccccccccc
aaaaaaaaaaaabbbbbbbbbbbbbccccccccccccc
aaaaaaaaaaaaabbbbbbbbbbbbbcccccccccccc
aaaaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc
aaaaaaaaaaaaaabbbbbbbbbbbbbbccccccccccccc
aaaaaaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccc
aaaaaaaaaaaaaaabbbbbbbbbbbbbbbcccccccccccccc
aaaaaaaaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccc
aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccc
aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbccccccccccccccccc
aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbcccccccccccccccc
aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbcccccccccccccccccc
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccccccccccc
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbccccccccccccccccccc
aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbcccccccccccccccccc
aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbcccccccccccccccccccc
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccc
Questa grammatica è ambigua
Programma Grammatica anbncn ( VI tris )
Program gram3 ;
uses crt ;
type vettore = array [ 1..60 ] of char ;
type vetbool = array [ 1..20 ] of boolean ;
var v, t, y : vettore ;
var z : vetbool ;
var i, n, q, x : integer ;
const a = char ( 'a' ) ;
const b = char ( 'b' ) ;
const c = char ( 'c' ) ;
const S = char ( 'S' ) ;
const G = char ( 'B' ) ;
procedure produzione ( n : integer; var v : vettore ) ;
var q, i, z, w, x, y, h : integer ;
var temp : char ;
begin
v [ 1 ] := S
if n = 1 then begin
v [ 1 ] = S then begin
v [ 1 ] := a ;
v [ 2 ] := b ;
v [ 3 ] := c ;
end ;
end
else begin
q := 3 ;
for i := 1 to n do begin
if i < > n then begin
if v [ i ] = S then begin
if i = 1 then begin
v [ i + q ] := c ;
v [ i+ (q-1) ] := G ;
v [ i+1 ] := a ;
q := q+2 ;
end
else begin
for z := 1 to (q-3) do v [ i+q-(z-1) ] :=v[ i+(q-3)-(z-1) ] ;
v [ i+3 ] := c ;
v [ i+2 ] := G ;
v [ i+1 ] := v [ i ] ;
v [ i ] := a ;
q := q+2 ;
end ;
end
end
else begin
for z := 1 to ( q-3 ) do v [ i + ( q-z ) ] := v [ i + ( q-3 )-( z-1 ) ]
v [ i+2 ] := c ;
v [ i+1 ] := b ;
v [ i ] := a ;
for h := 1 to n-1 do begin
for y := 1 to 60 do begin
if ( (v [ y ] = c) and ( v [ y +1 ] = G ) ) then begin
temp :=v[ y ] ;
v[y]:=v[y+1] ;
v[y+1]:=temp
end ;
end ;
end ;
for w := 1 to 60 do if ( ( v [ w-1] = b ) and ( v [ w ] = G ) ) then v [ w ] := b ;
end ;
end ;
end
Function amb ( var v1,v2 : vettore ): boolean ;
var i, c: integer ;
begin
c :=0 ;
for i :=1 to 59 do if v1 [ i ] =v2 [ i ] then c := c+1 ;
if c =59 then amb := True else amb := False ;
end
begin
clrscr
v [ 1 ] := S ;
for i := 1 to 20 do begin
produzione ( i, v ) ;
for x := 1 to 60 do begin
t [ x ] := v [ x ] ;
write ( t [ x ] ) ;
end ;
produzione ( i+1, v ) ;
for x := 1 to 60 do begin
y [ x ] := v [ x ] ;
write ( y [ x ] ) ;
end ;
z [ i ] := amb ( t, y ) ;
i := i+1 ;
end ;
for i := 1 to 20 do begin
if z [ i ] = true then writeln ( ' La grammatica è ambigua ' )
else writeln ( ' La grammatica non è ambigua ' ) ;
end ;
readln
end
Dimostrazione pratica
abc
aabbcc
aaabbbccc
aaaabbbbcccc
aaaaabbbbbccccc
aaaaaabbbbbbcccccc
aaaaaaabbbbbbbccccccc
aaaaaaaabbbbbbbbcccccccc
aaaaaaaaabbbbbbbbbccccccccc
aaaaaaaaaabbbbbbbbbbcccccccccc
aaaaaaaaaaabbbbbbbbbbbccccccccccc
aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc
aaaaaaaaaaaaabbbbbbbbbbbbbccccccccccccc
aaaaaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc
aaaaaaaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccc
aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccc
aaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbccccccccccccccccc
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbcccccccccccccccccc
aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbccccccccccccccccccc
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbcccccccccccccccccccc
La grammatica non è ambigua .
Privacy |
Articolo informazione
Commentare questo articolo:Non sei registratoDevi essere registrato per commentare ISCRIVITI |
Copiare il codice nella pagina web del tuo sito. |
Copyright InfTub.com 2025