找回密码
 欢迎注册
查看: 17728|回复: 0

[原创] Theorem Prover

[复制链接]
发表于 2011-9-21 17:46:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
今天使用了一下cvc3,一种一阶逻辑证明工具(类似的工具还有Z3,simplify等) 起因是看到百度数学吧中一个题目: 五名网球队员参加一次双打比赛,设选手A的分数为R(A),任意两名选手的分数不同,任意2名选手的分数和也各不相同。若R(A)+R(B)>R(C)+R(D)则称(A,B)这对选手胜(C,D)这对选手。于是将(C,D)拆散,另外两队选手(C,E)或(D,E)之一与(A,B)继续下一场比赛。直到某两对以前曾经交过手的组合再次相遇(相遇时比赛停止),求比赛最多能进行多少场 由此写了一个使用cvc3的程序:
  1. #include <stdio.h>
  2. #define A 'A'
  3. #define B 'B'
  4. #define C 'C'
  5. #define D 'D'
  6. #define E 'E'
  7. struct Match{
  8. char a,b,c,d;//a<b, c<d,a<c
  9. }M[15]={
  10. {A,B,C,D},
  11. {A,B,C,E},
  12. {A,B,D,E},
  13. {A,C,B,D},
  14. {A,C,B,E},
  15. {A,C,D,E},
  16. {A,D,B,C},
  17. {A,D,B,E},
  18. {A,D,C,E},
  19. {A,E,B,C},
  20. {A,E,B,D},
  21. {A,E,C,D},
  22. {B,C,D,E},
  23. {B,D,C,E},
  24. {B,E,C,D}
  25. };
  26. int edges[15][15];
  27. #define SET_EDGES(u1,v1,u2,v2) \
  28. edges[i][j]=1;\
  29. void init_edges()
  30. {
  31. int i,j;
  32. for(i=0;i<15;i++)for(j=0;j<15;j++){
  33. if(i==j)continue;
  34. if(M[i].a==M[j].a&&M[i].b==M[j].b){
  35. edges[i][j]=1;
  36. }else if(M[i].c==M[j].c&&M[i].d==M[j].d){
  37. if(M[i].b>M[i].d){
  38. edges[i][j]=1;
  39. }
  40. }else if(M[i].a==M[j].c&&M[i].b==M[j].d){
  41. edges[i][j]=1;
  42. }else if(M[i].c==M[j].a&&M[i].d==M[j].b){
  43. if(M[i].b>M[i].d){
  44. edges[i][j]=1;
  45. }
  46. }
  47. }
  48. }
  49. void dump_edges()
  50. {
  51. int i,j;
  52. for(i=0;i<15;i++)for(j=0;j<15;j++){
  53. if(edges[i][j]){
  54. printf("%c%c%c%c=>%c%c%c%c\n",M[i].a,M[i].b,M[i].c,M[i].d,M[j].a,M[j].b,M[j].c,M[j].d);
  55. }
  56. }
  57. printf("\n");
  58. }
  59. int best=8;
  60. int depth=0;
  61. int used[15];
  62. int stacks[15];
  63. void dump()
  64. {
  65. int i;
  66. printf("Candidate depth %d:\t",depth);
  67. for(i=0;i<depth;i++){
  68. int p=stacks[i];
  69. printf("%c%c%c%c ",M[p].a,M[p].b,M[p].c,M[p].d);
  70. }
  71. printf("\n");
  72. }
  73. static int cc;
  74. int check_succ()
  75. {
  76. char line[100];
  77. FILE *f=fopen("1.cvc","w");
  78. fprintf(f,"A,B,C,D,E:INT;\n");
  79. fprintf(f,"ASSERT A>B AND B>C AND C>D AND D>E;\n");
  80. int i;
  81. for(i=0;i<depth-1;i++){
  82. int p=stacks[i],q=stacks[i+1];
  83. if(M[p].a==M[q].a&&M[p].b==M[q].b){
  84. fprintf(f,"ASSERT %c+%c>%c+%c;\n",M[p].a,M[p].b,M[p].c,M[p].d);
  85. }else if(M[p].c==M[q].c&&M[p].d==M[q].d){
  86. fprintf(f,"ASSERT %c+%c>%c+%c;\n",M[p].c,M[p].d,M[p].a,M[p].b);
  87. }else if(M[p].a==M[q].c&&M[p].b==M[q].d){
  88. fprintf(f,"ASSERT %c+%c>%c+%c;\n",M[p].a,M[p].b,M[p].c,M[p].d);
  89. }else if(M[p].c==M[q].a&&M[p].d==M[q].b){
  90. fprintf(f,"ASSERT %c+%c>%c+%c;\n",M[p].c,M[p].d,M[p].a,M[p].b);
  91. }
  92. }
  93. fprintf(f,"CHECKSAT;");
  94. fclose(f);
  95. system("cvc3 < 1.cvc >cvc.out");
  96. f=fopen("cvc.out","r");
  97. fgets(line,100,f);
  98. fclose(f);
  99. if(strncmp(line,"Uns",3)==0){
  100. return 0;
  101. }else{
  102. sprintf(line,"mv 1.cvc cvc%d.cvc",cc);
  103. cc++;
  104. system(line);
  105. return 1;
  106. }
  107. }
  108. void search()
  109. {
  110. int i;
  111. int p=stacks[depth-1];
  112. if(depth>=best){
  113. if(check_succ()){
  114. best=depth;
  115. dump();
  116. }
  117. }
  118. for(i=0;i<15;i++){
  119. if(!used[i]&&edges[p][i]!=0){
  120. used[i]=1;stacks[depth++]=i;
  121. search();
  122. used[i]=0;depth--;
  123. }
  124. }
  125. }
  126. int main()
  127. {
  128. int i;
  129. init_edges();
  130. //dump_edges();
  131. for(i=0;i<15;i++){
  132. stacks[0]=i;
  133. used[i]=1;
  134. depth=1;
  135. search();
  136. used[i]=0;
  137. }
  138. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-24 10:06 , Processed in 0.022337 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表