AbraaoAllysson

Lógica parte 2 - Formula final

Sep 1st, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.73 KB | None | 0 0
  1. // Calculo de tabela verdade para formulas representadas
  2. // com arvores sintaticas.
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #define TRUE    1
  8. #define FALSE   0
  9.  
  10. // macro para calcular o valor da implicacao
  11. #define IMPVAL(b1, b2)       (b1 && !b2 ? FALSE : TRUE)
  12.  
  13. // macro para calcular o valor de uma bi-implicacao
  14. #define BIMPVAL(b1, b2)      (b1 == b2)
  15.  
  16. // tipo do no da arvore
  17. typedef enum tagTipo {
  18.   NEG, AND, OR, IMP, BIMP, P, Q, R
  19. } Tipo;
  20.  
  21. // uma formula da logica
  22. typedef struct tagForm
  23. {
  24.   Tipo tipo;
  25.   struct tagForm *dir;
  26.   struct tagForm *esq;
  27. } Formula;
  28.  
  29. #define VARS   3
  30. #define PIND   0
  31. #define QIND   1
  32. #define RIND   2
  33.  
  34. // representacao da formula
  35. char nome[VARS];     // nome das variaveis
  36. int I[VARS];         // interpretacao das variaveis
  37.  
  38. void inicializa_formula()
  39. {
  40.   nome[PIND] = 'P';
  41.   nome[QIND] = 'Q';
  42.   nome[RIND] = 'R';
  43.  
  44.   for (int c = 0; c < VARS; c++)
  45.     I[c] = FALSE;
  46. }
  47.  
  48. Formula* cria_formula(Tipo tipo, Formula *dir, Formula *esq)
  49. {
  50.   Formula *res = (Formula*) malloc(sizeof(Formula));
  51.  
  52.   if (res == NULL)
  53.     return NULL;
  54.  
  55.   res->tipo = tipo;
  56.   res->dir = dir;
  57.   res->esq = esq;
  58.  
  59.   return res;
  60. }
  61.  
  62. Formula* neg(Formula *e)
  63. {
  64.   return cria_formula(NEG, e, NULL);
  65. }
  66.  
  67. Formula* andF(Formula *d, Formula *e)
  68. {
  69.   return cria_formula(AND, d, e);
  70. }
  71.  
  72. Formula* orF(Formula *d, Formula *e)
  73. {
  74.   return cria_formula(OR, d, e);
  75. }
  76.  
  77. Formula* imp(Formula *d, Formula *e)
  78. {
  79.   return cria_formula(IMP, d, e);
  80. }
  81.  
  82. Formula* bimp(Formula *d, Formula *e)
  83. {
  84.   return cria_formula(BIMP, d, e);
  85. }
  86.  
  87. Formula* var_p()
  88. {
  89.   return cria_formula(P, NULL, NULL);
  90. }
  91.  
  92. Formula* var_q()
  93. {
  94.   return cria_formula(Q, NULL, NULL);
  95. }
  96.  
  97. Formula* var_r()
  98. {
  99.   return cria_formula(R, NULL, NULL);
  100. }
  101.  
  102. // Libera o espaco de memoria ocupada por uma formula
  103. void destroi_formula(Formula *f)
  104. {
  105.   if (f != NULL) {
  106.     switch(f->tipo) {
  107.     case AND:
  108.     case OR:
  109.     case IMP:
  110.     case BIMP:
  111.       destroi_formula(f->dir);
  112.       destroi_formula(f->esq);
  113.       break;
  114.  
  115.     case NEG:
  116.       destroi_formula(f->dir);
  117.       break;
  118.  
  119.     // outros casos sao de variaveis, que nao tem filhos
  120.     }
  121.  
  122.     free(f);
  123.   }
  124. }
  125.  
  126. int indice_variavel(Tipo tipo)
  127. {
  128.   switch(tipo) {
  129.   case P:
  130.     return PIND;
  131.  
  132.   case Q:
  133.     return QIND;
  134.  
  135.   case R:
  136.     return RIND;
  137.  
  138.   default:   // demais tipos nao representam variaveis
  139.     return -1;
  140.   }
  141. }
  142.  
  143. int valor_formula(Formula *f)
  144. {
  145.   switch(f->tipo) {
  146.   case P:
  147.   case Q:
  148.   case R:
  149.     return I[indice_variavel(f->tipo)];
  150.  
  151.   case NEG:
  152.     return !valor_formula(f->dir);
  153.  
  154.   case AND:
  155.     return valor_formula(f->dir) &&
  156.            valor_formula(f->esq);
  157.  
  158.   case OR:
  159.     return valor_formula(f->dir) ||
  160.            valor_formula(f->esq);
  161.  
  162.   case IMP:
  163.     return IMPVAL(valor_formula(f->dir),
  164.                     valor_formula(f->esq));
  165.  
  166.   case BIMP:
  167.     return BIMPVAL(valor_formula(f->dir),
  168.                    valor_formula(f->esq));
  169.   }
  170. }
  171.  
  172. // retorna TRUE se a interpretacao atual eh a ultima na tabela-verdade
  173. int ultima_interpretacao()
  174. {
  175.   int res = 1;
  176.  
  177.   for (int c = 0; c < VARS; c++) {
  178.     res = res && I[c];
  179.   }
  180.  
  181.   return res;
  182. }
  183.  
  184. // altera a interpretacao atual no array I[] para a proxima na
  185. // ordem da tabela-verdade
  186. void proxima_interpretacao()
  187. {
  188.   int c = VARS - 1;
  189.  
  190.   while (c >= 0 && I[c] != 0) {
  191.     I[c--] = 0;
  192.   }
  193.  
  194.   if (c >= 0)
  195.     I[c] = 1;
  196. }
  197.  
  198. void mostra_tabela(Formula *f)
  199. {
  200.   int fim = FALSE;
  201.  
  202.   inicializa_formula();
  203.  
  204.   printf("Formula:\n");
  205.   printf("(P -> (R ^ (Q v R))) ^ (~Q v (~Q -> (R ^ P))\n\n");
  206.   // printf("P -> (R ^ (Q v R)))\n");
  207.   for (int c = 0; c < VARS; c++) {
  208.     printf(" %c |", nome[c]);
  209.   }
  210.   printf(" H\n");
  211.  
  212.   for (int c = 0; c < 4 * VARS + 3; c++)
  213.     printf("-");
  214.   printf("\n");
  215.  
  216.   while (!fim) {
  217.     // imprime valores atuais das variaveis
  218.     for (int c = 0; c < VARS; c++) {
  219.       if (I[c])
  220.         printf(" T |");
  221.       else
  222.         printf(" F |");
  223.     }
  224.  
  225.     // calcula e imprime o valor da formula
  226.     if (valor_formula(f))
  227.       printf(" T\n");
  228.     else
  229.       printf(" F\n");
  230.  
  231.     // verifica se acabou a tabela ou passa para
  232.     // a proxima linha
  233.     if (ultima_interpretacao())
  234.       fim = TRUE;
  235.     else
  236.       proxima_interpretacao();
  237.   }
  238. }
  239.  
  240. int main(int argc, char **argv)
  241. {
  242.   // (P -> Q) /\ (~Q \/ R)
  243.  /* Formula *f =
  244.     andF(imp(var_p(), var_q()),
  245.         orF(neg(var_q()), var_r()));*/
  246.  
  247.   // P -> (R ^ (Q v R))) ^ (~Q v (~Q -> (R ^ P);
  248.   //P -> (R ^ (Q v R)))
  249.   Formula *f = andF( imp(var_p(), andF(var_r(),orF(var_q(),var_r()))),
  250.                     orF(neg(var_q()),imp(neg(var_q()),andF(var_r(),var_p())) ) );
  251.  
  252.   printf("Calculo de tabela-verdade\n\n");
  253.  
  254.   mostra_tabela(f);
  255.  
  256.   destroi_formula(f);
  257.  
  258.   return 0;
  259. }
Add Comment
Please, Sign In to add comment