Up: Enunciados Previous: Saída

Números

Considere uma grelha infinita que possui um número finito de elementos iluminados. Por exemplo

[unit=0.3cm,subgriddiv=1,gridlabels=0,gridwidth=0.3pt](0,0)(-4,-5)(5,4) [](0,0) [unit=0.3cm,linewidth=0.3pt](-4,4)(-4,5) [unit=0.3cm,linewidth=0.3pt](-3,4)(-3,5) [unit=0.3cm,linewidth=0.3pt](-2,4)(-2,5) [unit=0.3cm,linewidth=0.3pt](-1,4)(-1,5) [unit=0.3cm,linewidth=0.3pt](0,4)(0,5) [unit=0.3cm,linewidth=0.3pt](1,4)(1,5) [unit=0.3cm,linewidth=0.3pt](2,4)(2,5) [unit=0.3cm,linewidth=0.3pt](3,4)(3,5) [unit=0.3cm,linewidth=0.3pt](4,4)(4,5) [unit=0.3cm,linewidth=0.3pt](5,4)(5,5) [unit=0.3cm,linewidth=0.3pt](-4,-5)(-4,-6) [unit=0.3cm,linewidth=0.3pt](-3,-5)(-3,-6) [unit=0.3cm,linewidth=0.3pt](-2,-5)(-2,-6) [unit=0.3cm,linewidth=0.3pt](-1,-5)(-1,-6) [unit=0.3cm,linewidth=0.3pt](0,-5)(0,-6) [unit=0.3cm,linewidth=0.3pt](1,-5)(1,-6) [unit=0.3cm,linewidth=0.3pt](2,-5)(2,-6) [unit=0.3cm,linewidth=0.3pt](3,-5)(3,-6) [unit=0.3cm,linewidth=0.3pt](4,-5)(4,-6) [unit=0.3cm,linewidth=0.3pt](5,-5)(5,-6) [unit=0.3cm,linewidth=0.3pt](5,4)(6,4) [unit=0.3cm,linewidth=0.3pt](5,3)(6,3) [unit=0.3cm,linewidth=0.3pt](5,2)(6,2) [unit=0.3cm,linewidth=0.3pt](5,1)(6,1) [unit=0.3cm,linewidth=0.3pt](5,0)(6,0) [unit=0.3cm,linewidth=0.3pt](5,-1)(6,-1) [unit=0.3cm,linewidth=0.3pt](5,-2)(6,-2) [unit=0.3cm,linewidth=0.3pt](5,-3)(6,-3) [unit=0.3cm,linewidth=0.3pt](5,-4)(6,-4) [unit=0.3cm,linewidth=0.3pt](5,-5)(6,-5) [unit=0.3cm,linewidth=0.3pt](-4,4)(-5,4) [unit=0.3cm,linewidth=0.3pt](-4,3)(-5,3) [unit=0.3cm,linewidth=0.3pt](-4,2)(-5,2) [unit=0.3cm,linewidth=0.3pt](-4,1)(-5,1) [unit=0.3cm,linewidth=0.3pt](-4,0)(-5,0) [unit=0.3cm,linewidth=0.3pt](-4,-1)(-5,-1) [unit=0.3cm,linewidth=0.3pt](-4,-2)(-5,-2) [unit=0.3cm,linewidth=0.3pt](-4,-3)(-5,-3) [unit=0.3cm,linewidth=0.3pt](-4,-4)(-5,-4) [unit=0.3cm,linewidth=0.3pt](-4,-5)(-5,-5) [unit=0.3cm,linewidth=0.3pt](-6,-7)(-6,6)(7,6)(7,-7)(-6,-7) [unit=0.3cm,linewidth=1.5pt](-4,2)(-4,4)(-3,4)(-3,2)(-4,2) [unit=0.3cm,linewidth=1.5pt](-2,2)(-2,4) [unit=0.3cm,linewidth=1.5pt](0,2)(-1,2)(-1,3)(0,3)(0,4)(-1,4) [unit=0.3cm,linewidth=1.5pt](1,2)(2,2)(2,4)(1,4) [unit=0.3cm,linewidth=1.5pt](1,3)(2,3) [unit=0.3cm,linewidth=1.5pt](4,4)(4,3)(5,3) [unit=0.3cm,linewidth=1.5pt](5,2)(5,4) [unit=0.3cm,linewidth=1.5pt](-2,-1)(-3,-1)(-3,-2)(-2,-2)(-2,-3)(-3,-3) [unit=0.3cm,linewidth=1.5pt](-1,-1)(-1,-3)(0,-3)(0,-2)(-1,-2) [unit=0.3cm,linewidth=1.5pt](2,-1)(3,-1)(3,-3) [unit=0.3cm,linewidth=1.5pt](4,-3)(4,-5)(5,-5)(5,-3)(4,-3) [unit=0.3cm,linewidth=1.5pt](4,-4)(5,-4) [unit=0.3cm,linewidth=1.5pt](2,-6)(2,-4)(1,-4)(1,-5)(2,-5)







Estes elementos iluminados são representados por factos luz/4, que têm como argumentos as coordenadas do início e do fim. Tal como um mostrador digital, estas partes iluminadas pode ser vistas como formando números de 0 a 9.
Pretende-se que implemente um predicado numeros/1, que retorna uma lista (sem elementos duplicados, mas onde a ordem não é importante) com todos os números que são reconhecidos a partir do conjunto de factos dado. No caso da figura acima, a grelha contém todos os números de 0 a 9, pelo que devemos obter (a menos da ordem dos elementos na lista):

         ?- numeros(N).
            N = [0,1,2,3,4,5,6,7,8,9]

O ponto na grelha indica o ponto de coordenadas (0, 0). Desde modo, o número 3 pode ser representado pelos factos:

         luz(1,2,2,2).
         luz(2,2,2,3).
         luz(2,3,2,4).
         luz(2,3,1,3).
         luz(2,4,1,4).

Admitimos, por simplicidade, que todos os números estão representados na escala indicada na figura acima. Por conseguinte, o predicado numeros/1 não deverá reconhecer o número 8 na grelha


[unit=0.3cm,subgriddiv=1,gridlabels=0,gridwidth=0.3pt](0,0)(0,0)(9,4) [unit=0.3cm,linewidth=0.3pt](0,4)(0,5) [unit=0.3cm,linewidth=0.3pt](1,4)(1,5) [unit=0.3cm,linewidth=0.3pt](2,4)(2,5) [unit=0.3cm,linewidth=0.3pt](3,4)(3,5) [unit=0.3cm,linewidth=0.3pt](4,4)(4,5) [unit=0.3cm,linewidth=0.3pt](5,4)(5,5) [unit=0.3cm,linewidth=0.3pt](6,4)(6,5) [unit=0.3cm,linewidth=0.3pt](7,4)(7,5) [unit=0.3cm,linewidth=0.3pt](8,4)(8,5) [unit=0.3cm,linewidth=0.3pt](9,4)(9,5) [unit=0.3cm,linewidth=0.3pt](0,0)(0,-1) [unit=0.3cm,linewidth=0.3pt](1,0)(1,-1) [unit=0.3cm,linewidth=0.3pt](2,0)(2,-1) [unit=0.3cm,linewidth=0.3pt](3,0)(3,-1) [unit=0.3cm,linewidth=0.3pt](4,0)(4,-1) [unit=0.3cm,linewidth=0.3pt](5,0)(5,-1) [unit=0.3cm,linewidth=0.3pt](6,0)(6,-1) [unit=0.3cm,linewidth=0.3pt](7,0)(7,-1) [unit=0.3cm,linewidth=0.3pt](8,0)(8,-1) [unit=0.3cm,linewidth=0.3pt](9,0)(9,-1) [unit=0.3cm,linewidth=0.3pt](9,4)(10,4) [unit=0.3cm,linewidth=0.3pt](9,3)(10,3) [unit=0.3cm,linewidth=0.3pt](9,2)(10,2) [unit=0.3cm,linewidth=0.3pt](9,1)(10,1) [unit=0.3cm,linewidth=0.3pt](9,0)(10,0) [unit=0.3cm,linewidth=0.3pt](0,4)(-1,4) [unit=0.3cm,linewidth=0.3pt](0,3)(-1,3) [unit=0.3cm,linewidth=0.3pt](0,2)(-1,2) [unit=0.3cm,linewidth=0.3pt](0,1)(-1,1) [unit=0.3cm,linewidth=0.3pt](0,0)(-1,0) [unit=0.3cm,linewidth=0.3pt](-2,-2)(-2,6)(11,6)(11,-2)(-2,-2) [unit=0.3cm,linewidth=1.5pt](4,0)(4,4)(6,4)(6,0)(4,0) [unit=0.3cm,linewidth=1.5pt](4,2)(6,2)



Por outro lado, os números podem ter sofrido rotações e devem ser igualmente reconhecidos como sub parte de uma configuração de elementos iluminados. Por exemplo para a figura




[unit=0.3cm,subgriddiv=1,gridlabels=0,gridwidth=0.3pt](0,0)(0,0)(9,4) [unit=0.3cm,linewidth=0.3pt](0,4)(0,5) [unit=0.3cm,linewidth=0.3pt](1,4)(1,5) [unit=0.3cm,linewidth=0.3pt](2,4)(2,5) [unit=0.3cm,linewidth=0.3pt](3,4)(3,5) [unit=0.3cm,linewidth=0.3pt](4,4)(4,5) [unit=0.3cm,linewidth=0.3pt](5,4)(5,5) [unit=0.3cm,linewidth=0.3pt](6,4)(6,5) [unit=0.3cm,linewidth=0.3pt](7,4)(7,5) [unit=0.3cm,linewidth=0.3pt](8,4)(8,5) [unit=0.3cm,linewidth=0.3pt](9,4)(9,5) [unit=0.3cm,linewidth=0.3pt](0,0)(0,-1) [unit=0.3cm,linewidth=0.3pt](1,0)(1,-1) [unit=0.3cm,linewidth=0.3pt](2,0)(2,-1) [unit=0.3cm,linewidth=0.3pt](3,0)(3,-1) [unit=0.3cm,linewidth=0.3pt](4,0)(4,-1) [unit=0.3cm,linewidth=0.3pt](5,0)(5,-1) [unit=0.3cm,linewidth=0.3pt](6,0)(6,-1) [unit=0.3cm,linewidth=0.3pt](7,0)(7,-1) [unit=0.3cm,linewidth=0.3pt](8,0)(8,-1) [unit=0.3cm,linewidth=0.3pt](9,0)(9,-1) [unit=0.3cm,linewidth=0.3pt](9,4)(10,4) [unit=0.3cm,linewidth=0.3pt](9,3)(10,3) [unit=0.3cm,linewidth=0.3pt](9,2)(10,2) [unit=0.3cm,linewidth=0.3pt](9,1)(10,1) [unit=0.3cm,linewidth=0.3pt](9,0)(10,0) [unit=0.3cm,linewidth=0.3pt](0,4)(-1,4) [unit=0.3cm,linewidth=0.3pt](0,3)(-1,3) [unit=0.3cm,linewidth=0.3pt](0,2)(-1,2) [unit=0.3cm,linewidth=0.3pt](0,1)(-1,1) [unit=0.3cm,linewidth=0.3pt](0,0)(-1,0) [unit=0.3cm,linewidth=0.3pt](-2,-2)(-2,6)(11,6)(11,-2)(-2,-2) [unit=0.3cm,linewidth=1.5pt](2,1)(2,2)(4,2)(4,1) [unit=0.3cm,linewidth=1.5pt](3,1)(3,2) [unit=0.3cm,linewidth=1.5pt](4,3)(7,3)(7,4) [unit=0.3cm,linewidth=1.5pt](5,3)(5,4)(6,4)

deveremos ter

         ?- numeros(L).
            L = [1,3,4,7]

A orientação dos números não precisa ser a mesma para todos eles e uma parte acesa pode ser usada como parte de mais do que um número. Por exemplo, um 4 e um 1 estão escondidos num 9 --que também poderá ser um 6 rodado!


Up: Enunciados Previous: Saída


1999-04-01