Computabilidade e Linguagens Formais q Autmatos de pilha
Computabilidade e Linguagens Formais q Autómatos de pilha Gabriel David / Cristina Ribeiro 1
Autómatos e autómatos de pilha q Os autómatos de pilha estão para as linguagens sem contexto como os autómatos estão para as linguagens regulares Linguagens sem contexto 1 1*0(1+0)* E I | E+E | E×E | (E) I a | b | Ia | Ib | I 0 | I 1 Start 0 A 0, 1 2 B 2
Ideia q Autómato de pilha é um -NFA com uma pilha de símbolos – – q Adiciona a possibilidade de memorizar uma quantidade infinita de informação Só tem acesso ao topo da pilha (LIFO), em vez de poder consultar qualquer posição de memória, como os computadores genéricos Funcionamento – – A parte de controlo lê e consome os entrada símbolos da entrada Transição para novo estado baseada no estado corrente, símbolo de entrada e símbolo no topo da pilha Transição espontânea com Topo da pilha substituído por cadeia Controlo de estados finito Aceita/ rejeita pilha 3
Exemplo do palindroma q Lwwr = {ww. R | w em (0+1)*} – q palindromas de comprimento par Linguagem sem contexto gerada pela gramática P | 0 P 0 | 1 P 1 Construir um autómato de pilha – – Estado inicial q 0 significa que ainda não se atingiu o meio de ww. R; vai-se guardando na pilha os símbolos de w A qualquer altura, adivinha-se que já se chegou ao meio (fim de w) e faz-se uma transição para q 1; a pilha contém w, a começar no fundo e a acabar no topo; o não determinismo é simulado pela manutenção dos dois estados Em q 1 comparam-se os símbolos de entrada com o topo da pilha; se não houver correspondência, a aposta foi errada e este ramo da computação morre; outro poderá ter sucesso Se a pilha se esvaziar (e a entrada acabar) descobriu-se w e w. R 4
Definição q Autómato de pilha (PDA) P= (Q, , q 0, Z 0, F) – – Q: conjunto finito de estados : conjunto finito de símbolos de entrada : alfabeto da pilha finito : função de transição (q, a, X) = {(p 1, 1), …} finito q q q é um estado, a um símbolo de entrada ou , X um símbolo da pilha p 1 é o novo estado, 1 é a cadeia de símbolos da pilha que substitui X no topo – – – 1 = pop do topo da pilha 1= X pilha inalterada 1= YZ X substituído por Z e push do Y a seguir q 0: estado inicial Z 0: símbolo inicial, conteúdo inicial da pilha F: conjunto de estados de aceitação ou finais 5
De novo o exemplo q PDA de Lwwr P = ({q 0, q 1, q 2}, {0, 1, Z 0}, , q 0, Z 0, {q 2}) – – – Z 0 usado para marcar o fundo da pilha e permitir no fim da leitura de ww. R passar para o estado de aceitação q 2 (q 0, 0, Z 0)= {(q 0, 0 Z 0)} e (q 0, 1, Z 0)= {(q 0, 1 Z 0)} topo da pilha à esquerda (q 0, 0, 0)= {(q 0, 00)}, (q 0, 0, 1)= {(q 0, 01)}, (q 0, 1, 0)= {(q 0, 10)}, (q 0, 1, 1)= {(q 0, 11)} (q 0, , Z 0)= {(q 1, Z 0)}, (q 0, , 0)= {(q 1, 0)}, (q 0, , 1)= {(q 1, 1)} (q 1, 0, 0)= {(q 1, )} e (q 1, 1, 1)= {(q 1, )} (q 1, , Z 0)= {(q 2, Z 0)} 6
Diagrama de transição 0, Z 0/0 Z 0 1, Z 0/1 Z 0 0, 0/00 0, 1/01 1, 0/10 1, 1/11 Start q q 0 0, 0/ 1, 1/ , Z 0/Z 0 , 0/0 , 1/1 q 1 , Z 0/Z 0 q 2 Nós são estados Start indica o estado inicial Arcos correspondem às transições – – Etiqueta a, X/α de q para p significa que (q, a, X) contém (p, α) O arco indica a entrada e o topo da pilha antes e depois 7
Descrição instantânea q Computação de um PDA – – q Descrição instantânea (q, w, ) – – – q Evolui de configuração em configuração, em resposta a símbolos de entrada (ou ) e alterando a pilha Num DFA: toda a informação no estado; num PDA: estado + pilha q: estado w: entrada remanescente (em vez de só um símbolo, conveniência) : conteúdo da pilha (topo à esquerda) Passo de um PDA (Q, , q 0, Z 0, F) – – – Se (q, a, X) contiver (p, α), para todas as cadeias w em * e em * (q, aw, X ) ├P (p, w, α ) Usa-se ├* para zero ou mais passos (computação) 8
Ainda o exemplo q q Entrada w=1111 Descrição instantânea (DI) inicial: (q 0, 1111, Z 0) (q 1, 1111, Z 0) (q 0, 111, 1 Z 0) (q 1, 111, 1 Z 0) (q 2, 1111, Z 0) (q 2, 11, Z 0) (q 1, 11, Z 0) (q 0, 11 Z 0) (q 0, 1, 111 Z 0) (q 0, , 1111 Z 0) (q 1, 1, 111 Z 0) (q 1, 1, 1 Z 0) (q 1, , 11 Z 0) (q 1, , Z 0) (q 2, , Z 0) (q 1, , 1111 Z 0) 9
Princípios relativos a DI q q Se uma sequência de DIs (computação) é legal para um PDA P então a computação que resulta de adicionar uma qualquer cadeia w à entrada em cada DI também é legal Se uma computação é legal para um PDA P então a computação que resulta de adicionar um qualquer conjunto de símbolos abaixo da pilha em cada DI também é legal – q Teorema 1: Se (q, x, α) ├* (p, y, ) então (q, xw, α ) ├* (p, yw, ) Se uma computação é legal para um PDA P e uma cauda da entrada não é consumida, então a computação que resulta de remover essa cauda da entrada em cada DI também é legal – Teorema 2: Se (q, xw, α) ├* (p, yw, ) então (q, x, α) ├* (p, y, ) 10
Comentários q q q Dados para os quais P nunca olha não podem afectar a sua computação Conceito semelhante à própria noção de linguagem sem contexto: o que está ao lado não influencia a computação Teorema 2 não é o inverso do 1 porque o que está na pilha pode influenciar a computação mesmo sem ser descartado – Pode por exemplo ir sendo retirado da pilha um símbolo de cada vez e no último passo repor tudo 11
Linguagens de um PDA q Aceitação por estado final – – q Exemplo: – q (q 0, ww. R, Z 0) ├* (q 0, w. RZ 0) ├ (q 1, w. RZ 0) ├* (q 1, , Z 0) ├ (q 2, , Z 0) Aceitação por pilha vazia – – q Seja o PDA P = (Q, , q 0, Z 0, F) Linguagem de P aceite por estado final L(P) = {w | (q 0, w, Z 0) ├* (q, , α)} e q F Conteúdo final da pilha é irrelevante N(P) = {w | (q 0, w, Z 0) ├* (q, , )} Linguagem aceite por pilha vazia, conjunto de entradas w que P consome esvaziando ao mesmo tempo a pilha (N(P) – pilha nula) Mesmo exemplo: modificação para esvaziar a pilha e obter N(P)=L(P) – – (q 1, , Z 0)= {(q 2, Z 0)} passa a ser (q 1, , Z 0)= {(q 2, )} (q 0, ww. R, Z 0) ├* (q 0, w. RZ 0) ├ (q 1, w. RZ 0) ├* (q 1, , Z 0) ├ (q 2, , ) 12
Da pilha vazia ao estado final q Teorema: Se L = N(PN) para um PDA PN = (Q, , , N, q 0, Z 0) então existe um PDA PF tal que L = L(PF) – – – Dois métodos de aceitação de uma entrada equivalentes Embora para um PDA P possa ser L(P) N(P) Partindo de PN, usa-se um novo X 0 como símbolo inicial de PF e como marcador do fundo da pilha: PF vê X 0 quando pilha de PN vazia , X 0/ Start p 0 , X 0/Z 0 X 0 q 0 pf PN , X 0/ PF = (Q {p 0, pf}, , {X 0}, F, p 0, X 0, {pf}) 13
Do estado final à pilha vazia , any/ Start p 0 , X 0/Z 0 X 0 q 0 p PF , any/ 14
Exemplo de conversão q Defina um PDA que processe sequências de “i” e “e”, significando if e else, construção presente em muitas linguagens de programação, detectando sequências inválidas (sequências que têm mais “e’s” que “i’s” num prefixo) – – – Símbolo inicial Z; pilha com Zn significa que nº i’s - nº e’s = n-1 Aceitação por pilha vazia (balanço de mais um “e” que “i”) Conversão para aceitação por estado final e, Z/ i, Z/ZZ Start q pilha vazia e, Z/ i, Z/ZZ Start p , X 0/ZX 0 q , X 0/ r Estado final 15
Equivalência entre PDAs e CFGs q q Prova-se que as linguagens sem contexto, definidas por CFG, são as linguagens aceites por pilha vazia por um PDA e portanto também as aceites por estado final por um PDA Ideia: dada uma CFG G construir um PDA que simula as derivações mais à esquerda de G – – – Qualquer forma frásica esquerda não terminal pode ser escrita como x. Aα, onde A é a variável mais à esquerda. Aα é a cauda. CFG G = (V, T, Q, S) PDA que aceita L(G) por pilha vazia: P = ({q}, T, V T, , q, S) Para cada variável A: (q, , A)={(q, ) | A é produção em G} Para cada terminal a: (q, a, a)={(q, )} 16
De CFG para PDA q Dada a CFG q Obter um PDA de aceitação por pilha vazia que aceite a mesma linguagem. – PN = ({q}, {a, b, 0, 1, (, ), +, ×, E, I}, , q, E) – (q, , I) = {(q, a), (q, b), (q, Ia), (q, Ib), (q, I 0), (q, I 1)} – (q, , E) = {(q, I), (q, E+E), (q, E×E), (q, (E))} (q, a, a) = {(q, )}; (q, b, b)={(q, )}, (q, 0, 0) = {(q, )}; (q, 1, 1) = {(q, )}; (q, (, () = {(q, )}; (q, ), )) = {(q, )}; (q, +, +) = {(q, )}; (q, ×, ×) = {(q, )} – q E I | E+E | E×E | (E) I a | b | Ia | Ib | I 0 | I 1 Só um estado; processamento das variáveis espontâneo; só os terminais consomem entrada 17
Exercício q Usando a CFG e o PDA para a linguagem das expressões – – q a) obtenha uma derivação mais à esquerda de a (a+b 00) b) obtenha o traço da respectiva computação no PDA, isto é, a sequência de Descrições Instantâneas E E×E I×E a×(E) a×(E+E) a×(I+E) a×(a+I) a×(a+I 00) a×(a+b 00) b) – – – (q, a (a+b 00), E) ├ (q, a (a+b 00), E E) ├ (q, a (a+b 00), I E) ├ (q, a (a+b 00), a E) ├ (q, (a+b 00), E) ├ (q, (a+b 00), (E)) ├ (q, a+b 00), E+E)) ├ (q, a+b 00), I+E)) ├ (q, a+b 00), a+E)) ├ (q, +b 00), +E)) ├ (q, b 00), I)) ├ (q, b 00), I 00)) ├ (q, b 00)) ├ (q, 0)) ├ (q, ), )) ├ (q, , ) 18
De PDA para CFG q q Ideia: reconhecer que o evento fundamental num processamento num PDA é o pop final de um símbolo da pilha enquanto se consome entrada Acrescentar variáveis na linguagem para – – q Cada eliminação definitiva de um símbolo X da pilha Cada mudança de estado de p para q ao eliminar X, representada por um símbolo composto [p. Xq] Regra: do PDA P= (Q, , , N, q 0, Z 0) construir CFG G= (V, , R, S) – Variáveis V: contém S e os símbolos [p. Xq] 19
De PDA para CFG (cont) q Produções R: – Para todos os estados p, G contém S [q 0 Z 0 p] q q – O símbolo [q 0 Z 0 p] gera todas as cadeias w que extraem Z 0 da pilha enquanto vão do estado q 0 para o estado p, (q 0, w, Z 0) ├* (p, , ) Então S gera todas as cadeias w que esvaziam a pilha Se (q, a, X) contém o par (r, Y 1 Y 2…Yk), k 0, a ou a= então para todas as listas de estados r 1, r 2, …, rk, G contém [q. Xrk] a[r. Y 1 r 1][r 1 Y 2 r 2]…[rk-1 Ykrk] q Uma forma de extrair X e ir de q a rk é ler a (pode ser ) e usar alguma entrada para extrair Y 1 ao ir de r para r 1, etc. 20
Exemplo q Converter o PDA PN=({q}, {i, e}, {Z}, N, q, Z) numa gramática – q aceita as cadeias que violam pela 1ª vez a regra de que um “e” deve corresponder a um “i” precedente Solução: – – – só um estado q e só um símbolo de pilha Z Duas variáveis: S, símbolo inicial; [q. Zq], único símbolo a partir dos estados e símbolos de PN Produções: q q S [q. Zq] (se houvesse mais estados p e r teríamos S [q. Zp] e S [q. Zr]) De N(q, i, Z)={(q, ZZ)} obter [q. Zq] i[q. Zq] (se houvesse mais estados p e r teríamos [q. Zp] i[q. Zr] [r. Zp]) De N(q, e, Z)={(q, )} obter [q. Zq] e (Z é substituído por nada) Chamando A a [q. Zq] fica S A e A i. AA | e 21
Propriedades das CFL q q Simplificação das CFGs forma normal de Chomsky Eliminação de símbolos inúteis – – Símbolo útil: S * αX * w, w T* Símbolo gerador: X * w q – – – q Qualquer terminal é gerador, dele próprio! Símbolo atingível: S * αX Útil = gerador + atingível Eliminar primeiro os não geradores e depois os não atingíveis Exemplo – – S AB | a A b S a [B não é gerador] A b S a [A não é atingível] 22
Eliminação de símbolos inúteis q Algoritmo: descobrir os símbolos geradores – – q os terminais são geradores A α e α só tem geradores; então A é gerador Algoritmo: descobrir os símbolos atingíveis – – S é atingível A é atingível, A α; então todos os símbolos em α são atingíveis 23
Eliminação de produções- q q q Variável anulável: A * Transformação: B CAD passa a B CD | CAD e impede -se que A produza Algoritmo: descobrir as variáveis anuláveis – q A C 1 C 2 … Ck, todos os Ci são anuláveis; então A é anulável Se uma linguagem L tem uma CFG então L-{ } tem uma CFG sem produções- – – Determinar todos os símbolos anuláveis Para cada A X 1 X 2 … Xk se m Xi’s são anuláveis substituir por 2 m produções com todas as combinações de presenças de Xi. Excepção: se m=k, não se inclui o caso de todos os Xi ausentes Produções A são eliminadas 24
Exemplo q Gramática – – – q q S AB A a. AA | B b. BB | A e B são anuláveis, logo S também S AB | A | B A a. AA | a B b. BB | b 25
Eliminação de produções unitárias q Produção unitária: A B, em que A e B são variáveis – – q Eliminam-se por expansão – – q Podem ser úteis na eliminação de ambiguidade (ex: linguagem das expressões) Não são imprescindíveis; introduzem passos extra nas derivações I a | b | Ia | Ib | I 0 | I 1 F I | (E) T F|T×F E T|E+T De E T passar a E F | T × F a E I | (E) | T × F e finalmente E a | b | Ia | Ib | I 0 | I 1 | (E) | T × F – Problema no caso de ciclos 26
Eliminação de produções unitárias q Algoritmo: descobrir todos os pares unitários, deriváveis apenas com produções unitárias – – q q (A, A) é um par unitário (A, B) é um par unitário e B C, C variável; então (A, C) é unitário Exemplo: (E, E), (T, T), (F, F), (E, T), (E, F), (E, I), (T, F), (T, I), (F, I) Eliminação: substituir as produções existentes de forma a que para cada par unitário (A, B) se incluam todas as produções da forma A α em que B α é uma produção não unitária (incluir A=B) 27
Gramática sem produções unitárias I a | b | Ia | Ib | I 0 | I 1 F I | (E) T F|T×F E T|E+T Par Produções (E, E) E E+T (E, T) E T×F (E, F) E (E) (E, I) E a | b | Ia | Ib | I 0 | I 1 (T, T) T T×F (T, F) T (E) (T, I) T a | b | Ia | Ib | I 0 | I 1 (F, F) F (E) (F, I) F a | b | Ia | Ib | I 0 | I 1 (I, I) I a | b | Ia | Ib | I 0 | I 1 28
Sequência de simplificação q Se G é uma CFG que gera uma linguagem com pelo menos uma cadeia diferente de , existe uma CFG G 1 que não tem produções- , produções unitárias ou símbolos inúteis e L(G 1) O= L(G) – { } – – – Eliminar produções- Eliminar produções unitárias Eliminar símbolos inúteis 29
Forma normal de Chomsky (CNF) q Todas as CFL sem têm uma gramática na forma normal de Chomsky: sem símbolos inúteis e em que todas as produções são da forma – – q A BC (A, B, C variáveis) ou A a (A variável e a terminal) Transformação – – – Começar com uma gramática sem produções- , produções unitárias ou símbolos inúteis Deixar as produções A a Passar todos os corpos de comprimento 2 ou mais para só variáveis q – Variáveis novas D para os terminais d nesses corpos, substituir e D d Partir corpos de comprimento 3 ou mais em cascatas de produções só com 2 variáveis A B 1 B 2…Bk para A B 1 C 1, C 1 B 2 C 2, … 30
Gramática das expressões q Variáveis para os terminais em corpos não isolados – – – q A a B b Z 0 O 1 P + M × L ( R ) E EPT | TMF | LER | a | b | IA | IB | IZ | IO T TMF | LER | a | b | IA | IB | IZ | IO F LER | a | b | IA | IB | IZ | IO I a | b | IA | IB | IZ | IO Substituir corpos compridos – – E EC 1 | TC 2 | LC 3 | a | b | IA | IB | IZ | IO T TC 2 | LC 3 | a | b | IA | IB | IZ | IO F LC 3 | a | b | IA | IB | IZ | IO C 1 PT C 2 MF C 3 ER 31
Lema da bombagem para CFL q Dimensão de uma árvore de análise – – q Considerar apenas o caso das CNF: árvores binárias em que as folhas são terminais sem irmãos (produções A a) Numa gramática com árvore de análise CNF e colheita w terminal, se o comprimento do maior caminho for n então |w| 2 n-1 Seja L uma CFL. Existe uma constante n tal que, para qualquer cadeia z em L com |z| n se pode escrever z=uvwxy – – – |vwx| n a parte do meio não é demasiado comprida vx pelo menos uma é não vazia Para todo i 0, uviwxiy L bombagem dupla, a começar em 0 32
Prova q q q Obter uma gramática CNF G para L G contém m variáveis. Escolher n=2 m. Cadeia z em L |z| n. Qualquer árvore de análise com caminho mais longo de comprimento até m tem colheita até 2 m-1=n/2. – q z seria demasiado longa; árvore para z tem caminho m+1 ou maior Na figura, o caminho A 0…Aka é de comprimento k+1, k m – – Há pelo menos m+1 variáveis no caminho; logo há pelo menos uma repetição de variáveis (de Ak-m a Ak). Supõe-se Ai=Aj com k-m i < j k 33
Continuação da prova q q A 0 Se cadeia z suficientemente longa, tem que haver repetições de símbolos Divide-se a árvore: – – – w é a colheita da subárvore de Aj v e x são tais que vwx é a colheita de Ai (como não há produções unitárias pelo menos um de v e x é não nulo) u e y são as partes de z à u esquerda e à direita de vwx Ai=Aj Aj v Ak a w z x y 34
Continuação da prova q Como Ai=Aj, pode-se – – q S substituir a subárvore de Ai pela de Aj, obtendo o caso i=0, uwy. substituir a subárvore de Aj pela de Ai, obtendo o caso i=2, uv 2 wx 2 y e repetir para i=3, … (bombagem) |vwx| n porque se pegou num Ai próximo do fundo da árvore, k-i m, caminho mais longo de Ai até m+1, colheita até 2 m=n A A u v w x y S S A A w u A y u v A v w x y x 35
Lema da bombagem LR (DFA) q no caso das LR: o lema da bombagem decorre de o número de estados de um DFA ser finito – q CFL (CFG) para aceitar uma cadeia suficientemente comprida tem que haver repetições de estados No caso das CFL: decorre de o número de símbolos numa CFG ser finito – para aceitar uma cadeia suficientemente comprida tem que haver repetições (“duplas”) de símbolos 36
Provar que uma linguagem não é CFL q Seja L = {0 k 1 k 2 k | k 1}. Mostre que não é CFL. – – – Supondo que L é uma CFL, existe uma constante n indicada pelo lema da bombagem; tome-se z = 0 n 1 n 2 n que faz parte de L Fazendo z=uvwxy, sujeito a |vwx| n e v, x não ambos nulos, temos que vwx não pode conter simultaneamente 0’s e 2’s Caso vwx não contém 2’s; então vx tem só 0’s e 1’s e tem pelo menos um símbolo. Então, pelo lema da bombagem, uwy também deveria pertencer à linguagem. Mas tem n 2’s e menos do que n 0’s ou 1’s e portanto não pertence à linguagem. Caso vwx não contém 0’s: argumento semelhante. Obtém-se contradição em ambos os casos; portanto a hipótese é falsa e L não é uma CFL 37
Problemas na prova q Seja L = {0 k 1 k | k 1}. Mostre que não é CFL. – – q Supondo que L é uma CFL, existe uma constante n indicada pelo lema da bombagem; tome-se z = 0 n 1 n que faz parte de L Fazendo z=uvwxy, sujeito a |vwx| n e v, x não ambos nulos, pode acontecer de escolher v= 0 k e x=1 k Neste caso uviwxiy pertence sempre a L. Não se obtém a contradição pretendida Não se consegue provar que L não é CFL – De facto é uma CFL 38
Substituição q Seja um alfabeto; para cada um dos seus símbolos a define -se uma função (substituição) que associa uma linguagem La ao símbolo – – q Exemplo: – – – q Cadeias: se w= a 1…an então s(w) é a linguagem de todas as cadeias x 1…xn tais que xi está em s(ai) Linguagens: s(L) é a união de todos as s(w) tais que w L ={0, 1}, s(0)={anbn | n 1}, s(1)={aa, bb} Se w=01, s(w) = s(0)s(1) = {anbnaa | n 1} {anbn+2 | n 1} Se L=L(0*), s(L) = (s(0))* = an 1 bn 1…ankbnk, para n 1, …, nk qq Teorema: seja L uma CFL e s() uma substituição que associa a cada símbolo uma CFL; então s(L) é uma CFL. 39
Aplicação do teorema da substituição q As CFL são fechadas para: – – – União Concatenação Fecho (*) e fecho positivo (+) Homomorfismo Reverso Intersecção com uma LR q – Intersecção com uma CFL não é garantida Homomorfismo inverso 40
CFL e intersecção q q Seja L 1 = {0 n 1 n 2 i | n 1, i 1} e L 2 = {0 i 1 n 2 n | n 1, i 1} L 1 e L 2 são CFL – – – q S AB A 0 A | 0 B 1 B 2 | 12 L 1 L 2 = {0 n 1 n 2 n | n 1} – q S AB A 0 A 1 | 01 B 2 B | 2 Já está provado que não é CFL Logo as CFL não são fechadas para a intersecção 41
Complexidade das conversões q Conversões lineares no comprimento da representação – – – q Conversão O(n 3) – q CFG para PDA de estado final para PDA de pilha vazia para PDA de estado final PDA para CFG (tamanho da CFG também O(n 3)) Conversão O(n 2) – CFG para CNF (tamanho da CNF também O(n 2)) 42
Propriedades de decisão das CFL q Teste de linguagem vazia – Verificar se S é gerador q q Com estrutura de dados adequada, O(n) Teste de pertença numa CFL – O(n 3), usando programação dinâmica, preenchimento de tabela S AB | BC X 15 X 14 X 25 B CC | b X 12 X 23 X 34 X 45 X 11 X 22 X 33 X 44 X 55 a 2 a 3 {S, A, C} A BA | a X 13 X 24 X 35 a 1 {S, A, C} a 4 a 5 C AB | a w=baaba {B} {S, A} {B} {S, C} {S, A} {B} {A, C} b a a b a X 12: X 11 X 22; X 24: X 22 X 34 X 23 X 44 43
Problemas não decidíveis q Não há algoritmo para responder a estas perguntas – – – Uma dada CFG é ambígua? Uma dada CFL é inerentemente ambígua? A intersecção de duas CFL é vazia? Duas CFL dadas são a mesma linguagem? Uma CFL é o “universo” *, em que é o seu alfabeto? 44
- Slides: 44