MrSlippery

Finding a Magic Square with KLEE

Feb 18th, 2016
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <klee/klee.h>
  2.  
  3. #define N 3
  4.  
  5. unsigned char square[N * N];
  6.  
  7. unsigned int line(int i, int j) { return i * N + j; }
  8.  
  9. unsigned int col(int i, int j) { return i + j * N; }
  10.  
  11. unsigned int sum_line_col(unsigned int (*f)(int i, int j))
  12. {
  13.     int i, j;
  14.     unsigned int sum, csum;
  15.  
  16.     for (i = 0; i < N; i++) {
  17.         csum = 0;
  18.         for (j = 0; j < N; j++) {
  19.             csum += square[ f(i, j) ];
  20.         }
  21.         if (0 == i) {
  22.             sum = csum;
  23.         }
  24.         if (sum != csum) {
  25.             return 0;
  26.         }
  27.     }
  28.     return csum;
  29. }
  30.  
  31. unsigned int sum_diag()
  32. {
  33.     int i;
  34.     unsigned int main_sum = 0, sec_sum = 0;
  35.     for (i = 0; i < N; i++) {
  36.         main_sum += square[ line(i, i) ];
  37.     }
  38.    
  39.     unsigned int sum = 0;
  40.     for (i = 0; i < N; i++) {
  41.         sec_sum += square[ line(i, i) ];
  42.     }
  43.    
  44.     if (main_sum != sec_sum) {
  45.         return 0;
  46.     }
  47.     return main_sum;
  48. }
  49.  
  50. int each_once()
  51. {
  52.     unsigned char all_nums[N * N] = { 0 };
  53.     int i, j;  
  54.     for (i = 0; i < N; i++) {
  55.         for (j = 0; j < N; j++) {
  56.             unsigned cell = square[ line(i, j) ];
  57.             if (cell > N * N || cell < 1) {
  58.                 return 0;
  59.             }
  60.             all_nums[cell - 1]++;
  61.         }
  62.     }
  63.     for(i = 0; i < N * N; i++) {
  64.         if (all_nums[i] > 1) {
  65.             return 0;
  66.         }
  67.     }
  68.     return 1;
  69. }
  70.  
  71. int magic()
  72. {
  73.     unsigned int s_line = sum_line_col(&line);
  74.     unsigned int s_col = sum_line_col(&col);
  75.     unsigned int s_diag = sum_diag();
  76.     if (each_once() && s_line == s_col && s_col == s_diag) {
  77.         return 1;
  78.     }
  79.     return 0;
  80. }
  81.  
  82. int main(int argc, char *argv[])
  83. {
  84.     klee_make_symbolic(&square[0], sizeof(unsigned char) * N * N, "square");
  85.     klee_assert(!magic());
  86.     return 0;
  87. }
Advertisement