source: CIVL/examples/verifyThisProblems/RelaxedPrefix_2015_1.c@ c1381dd

1.23 2.0 main test-branch
Last change on this file since c1381dd was f3368e99, checked in by Yihao Yan <yihaoyan1@…>, 10 years ago

formatting some verifyThis problem solutions

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@3076 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 1.8 KB
Line 
1#include <stdio.h>
2#include <stdbool.h>
3#include <civlc.cvh>
4
5/*
6@author: Yihao Yan
7
8Link(challenge 1): http://etaps2015.verifythis.org/challenges
9
10problem description:
11Verify a function isRelaxedPrefix determining if a list _pat_ (for
12pattern) is a relaxed prefix of another list _a_.
13
14The relaxed prefix property holds iff _pat_ is a prefix of _a_ after
15removing at most one element from _pat_.
16
17examples:
18
19pat = {1,3} is a relaxed prefix of a = {1,3,2,3} (standard prefix)
20
21pat = {1,2,3} is a relaxed prefix of a = {1,3,2,3} (remove 2 from pat)
22
23pat = {1,2,4} is not a relaxed prefix of a = {1,3,2,3}.
24
25command: civl verify RelaxedPrefix_2015_1.c
26
27*/
28$input int N1_BOUND = 4;
29$input int N2_BOUND = 3;
30$input int n1;
31$input int n2;
32$input int X2[n2];
33$input int X1[n1];
34$assume (n2>=0 && n2 < N2_BOUND);
35$assume (n1>=0 && n1 < N1_BOUND);
36
37bool isRelaxedPrefix(int* pat, int patLen, int* a, int aLen){
38 int shift = 0;
39 int i;
40
41 if(patLen > aLen+1) return false;
42
43 if(aLen == 0) return true;
44
45 for(i=0; i<patLen; i++){
46 if(pat[i] != a[i-shift]){
47 if(shift == 0)
48 shift = 1;
49 else
50 return false;
51 }
52 if(i == aLen - 1 && shift == 0) return true;
53 }
54 return true;
55}
56
57void main(){
58 bool result = isRelaxedPrefix(X1, n1, X2, n2);
59
60 if(n1 > n2+1){
61 $assert(!result);
62 }else if(n1 == n2+1){
63 $assert( result ==
64 ($exists {int k | k >= 0 && k < n1}
65 (
66 ($forall {int i | i >= 0 && i < k} X1[i] == X2[i]) &&
67 ($forall {int i | i > k && i < n1} X1[i] == X2[i-1])
68 )
69 )
70 );
71 }else{
72 $assert(result ==
73 ($exists {int k | k >= 0 && k <=n1}
74 (
75 ($forall {int i | i >= 0 && i < k} X1[i] == X2[i]) &&
76 ($forall {int i | i > k && i < n1} X1[i] == X2[i-1])
77 )
78 )
79 );
80 }
81}
Note: See TracBrowser for help on using the repository browser.