source: CIVL/examples/verifyThisProblems/RelaxedPrefix_2015_1.c@ 7ea52ed

1.23 2.0 acw/focus-triggers main test-branch
Last change on this file since 7ea52ed was 4b8f2689, checked in by Yihao Yan <yihaoyan1@…>, 10 years ago

minor changes

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

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