Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
inox
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
LARA
inox
Commits
bfdb241c
Commit
bfdb241c
authored
9 years ago
by
Manos Koukoutos
Browse files
Options
Downloads
Patches
Plain Diff
Benchmark should use BigInts
parent
22ba0bf0
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
testcases/synthesis/future/SortedList.scala
+23
-20
23 additions, 20 deletions
testcases/synthesis/future/SortedList.scala
with
23 additions
and
20 deletions
testcases/synthesis/future/SortedList.scala
+
23
−
20
View file @
bfdb241c
...
@@ -4,41 +4,44 @@ import leon.lang.synthesis._
...
@@ -4,41 +4,44 @@ import leon.lang.synthesis._
object
SortedList
{
object
SortedList
{
sealed
abstract
class
List
sealed
abstract
class
List
case
class
Cons
(
head
:
Int
,
tail
:
List
)
extends
List
case
class
Cons
(
head
:
Big
Int
,
tail
:
List
)
extends
List
case
class
Nil
()
extends
List
case
class
Nil
()
extends
List
// proved with unrolling=0
// proved with unrolling=0
def
size
(
l
:
List
)
:
Int
=
(
l
match
{
def
size
(
l
:
List
)
:
Big
Int
=
(
l
match
{
case
Nil
()
=>
0
case
Nil
()
=>
BigInt
(
0
)
case
Cons
(
_
,
t
)
=>
1
+
size
(
t
)
case
Cons
(
_
,
t
)
=>
BigInt
(
1
)
+
size
(
t
)
})
ensuring
(
res
=>
res
>=
0
)
})
ensuring
(
res
=>
res
>=
BigInt
(
0
)
)
//def sizeSynth(l: List): Int = choose{ (i: Int) => i >= 0 && sizeSynth(Cons(0, l)) == i + 1}
//def sizeSynth(l: List):
Big
Int = choose{ (i:
Big
Int) => i >= 0 && sizeSynth(Cons(0, l)) == i + 1}
def
content
(
l
:
List
)
:
Set
[
Int
]
=
l
match
{
def
content
(
l
:
List
)
:
Set
[
Big
Int
]
=
l
match
{
case
Nil
()
=>
Set
()
case
Nil
()
=>
Set
()
case
Cons
(
i
,
t
)
=>
Set
(
i
)
++
content
(
t
)
case
Cons
(
i
,
t
)
=>
Set
(
i
)
++
content
(
t
)
}
}
def
groundSynth
()
=
choose
{
(
out
:
List
)
=>
size
(
out
)
==
5
}
def
groundSynth
()
=
choose
{
(
out
:
List
)
=>
size
(
out
)
==
5
}
def
insertSynth
(
in
:
List
,
v
:
Int
)
=
choose
{
(
out
:
List
)
=>
content
(
out
)
==
content
(
in
)
++
Set
(
v
)
}
def
insertSynth
(
in
:
List
,
v
:
Big
Int
)
=
choose
{
(
out
:
List
)
=>
content
(
out
)
==
content
(
in
)
++
Set
(
v
)
}
def
tailSynth
(
in
:
List
)
=
choose
{
out
:
List
=>
size
(
out
)+
1
==
size
(
in
)}
def
tailSynth
(
in
:
List
)
=
choose
{
out
:
List
=>
size
(
out
)+
1
==
size
(
in
)}
def
consSynth
(
in
:
List
)
=
choose
{
out
:
List
=>
size
(
out
)
==
size
(
in
)+
1
}
def
consSynth
(
in
:
List
)
=
choose
{
out
:
List
=>
size
(
out
)
==
size
(
in
)+
1
}
def
listOfSizeSynth
(
i
:
Int
)
=
choose
{
out
:
List
=>
size
(
out
)
==
i
}
def
listOfSizeSynth
(
i
:
BigInt
)
=
{
require
(
i
>=
0
)
choose
{
out
:
List
=>
size
(
out
)
==
i
}
}
def
insert1
(
l
:
List
,
v
:
Int
)
=
(
def
insert1
(
l
:
List
,
v
:
Big
Int
)
=
(
Cons
(
v
,
l
)
Cons
(
v
,
l
)
)
ensuring
(
res
=>
content
(
res
)
==
content
(
l
)
++
Set
(
v
)
&&
size
(
res
)
>=
size
(
l
))
)
ensuring
(
res
=>
content
(
res
)
==
content
(
l
)
++
Set
(
v
)
&&
size
(
res
)
>=
size
(
l
))
def
insert2
(
l
:
List
,
v
:
Int
)
:
List
=
(
l
match
{
def
insert2
(
l
:
List
,
v
:
Big
Int
)
:
List
=
(
l
match
{
case
Nil
()
=>
Cons
(
v
,
Nil
())
case
Nil
()
=>
Cons
(
v
,
Nil
())
case
Cons
(
x
,
tail
)
=>
if
(
x
==
v
)
l
else
Cons
(
x
,
insert2
(
tail
,
v
))
case
Cons
(
x
,
tail
)
=>
if
(
x
==
v
)
l
else
Cons
(
x
,
insert2
(
tail
,
v
))
})
ensuring
(
res
=>
content
(
res
)
==
content
(
l
)
++
Set
(
v
)
&&
size
(
res
)
>=
size
(
l
))
})
ensuring
(
res
=>
content
(
res
)
==
content
(
l
)
++
Set
(
v
)
&&
size
(
res
)
>=
size
(
l
))
def
insert3
(
l
:
List
,
v
:
Int
)
:
List
=
{
def
insert3
(
l
:
List
,
v
:
Big
Int
)
:
List
=
{
require
(
isStrictlySorted
(
l
))
require
(
isStrictlySorted
(
l
))
l
match
{
l
match
{
...
@@ -54,14 +57,14 @@ object SortedList {
...
@@ -54,14 +57,14 @@ object SortedList {
}
}
}
ensuring
(
res
=>
content
(
res
)
==
content
(
l
)
++
Set
(
v
)
&&
size
(
res
)
>=
size
(
l
))
}
ensuring
(
res
=>
content
(
res
)
==
content
(
l
)
++
Set
(
v
)
&&
size
(
res
)
>=
size
(
l
))
def
deleteSynth
(
in
:
List
,
v
:
Int
)
=
choose
{
(
out
:
List
)
=>
!(
content
(
out
)
contains
v
)
}
def
deleteSynth
(
in
:
List
,
v
:
Big
Int
)
=
choose
{
(
out
:
List
)
=>
!(
content
(
out
)
contains
v
)
}
def
delete1
(
l
:
List
,
v
:
Int
)
:
List
=
(
l
match
{
def
delete1
(
l
:
List
,
v
:
Big
Int
)
:
List
=
(
l
match
{
case
Nil
()
=>
Nil
()
case
Nil
()
=>
Nil
()
case
Cons
(
x
,
tail
)
=>
if
(
x
==
v
)
delete1
(
tail
,
v
)
else
Cons
(
x
,
delete1
(
tail
,
v
))
case
Cons
(
x
,
tail
)
=>
if
(
x
==
v
)
delete1
(
tail
,
v
)
else
Cons
(
x
,
delete1
(
tail
,
v
))
})
ensuring
(
res
=>
!(
content
(
res
)
contains
v
)
&&
size
(
res
)
<=
size
(
l
))
})
ensuring
(
res
=>
!(
content
(
res
)
contains
v
)
&&
size
(
res
)
<=
size
(
l
))
//def delete2(l: List, v: Int): List = {
//def delete2(l: List, v:
Big
Int): List = {
// require(isStrictlySorted(l))
// require(isStrictlySorted(l))
// l match {
// l match {
...
@@ -75,19 +78,19 @@ object SortedList {
...
@@ -75,19 +78,19 @@ object SortedList {
// }
// }
//} ensuring(res => !(content(res) contains v) && size(res) <= size(l))
//} ensuring(res => !(content(res) contains v) && size(res) <= size(l))
def
contains
(
list
:
List
,
elem
:
Int
)
:
Boolean
=
(
list
match
{
def
contains
(
list
:
List
,
elem
:
Big
Int
)
:
Boolean
=
(
list
match
{
case
Nil
()
=>
false
case
Nil
()
=>
false
case
Cons
(
x
,
xs
)
=>
if
(
elem
==
x
)
true
else
contains
(
xs
,
elem
)
case
Cons
(
x
,
xs
)
=>
if
(
elem
==
x
)
true
else
contains
(
xs
,
elem
)
})
ensuring
(
res
=>
res
==
content
(
list
).
contains
(
elem
))
})
ensuring
(
res
=>
res
==
content
(
list
).
contains
(
elem
))
def
deleteMagic
(
head
:
Int
,
tail
:
List
,
toDelete
:
Int
)
:
List
=
({
def
deleteMagic
(
head
:
Big
Int
,
tail
:
List
,
toDelete
:
Big
Int
)
:
List
=
({
//require(isStrictlySorted(Cons(head, tail)) && toDelete < head);
//require(isStrictlySorted(Cons(head, tail)) && toDelete < head);
require
(
isStrictlySorted
(
Cons
(
toDelete
,
Cons
(
head
,
tail
))))
require
(
isStrictlySorted
(
Cons
(
toDelete
,
Cons
(
head
,
tail
))))
Cons
(
head
,
tail
)
Cons
(
head
,
tail
)
})
ensuring
(
res
=>
!(
content
(
res
)
contains
toDelete
))
})
ensuring
(
res
=>
!(
content
(
res
)
contains
toDelete
))
def
delete3
(
l
:
List
,
v
:
Int
)
:
List
=
{
def
delete3
(
l
:
List
,
v
:
Big
Int
)
:
List
=
{
require
(
isStrictlySorted
(
l
))
require
(
isStrictlySorted
(
l
))
l
match
{
l
match
{
...
@@ -119,7 +122,7 @@ object SortedList {
...
@@ -119,7 +122,7 @@ object SortedList {
case
Cons
(
x
,
xs
)
=>
lessThanAll
(
x
,
xs
)
case
Cons
(
x
,
xs
)
=>
lessThanAll
(
x
,
xs
)
}))
}))
def
lessThanAll
(
x
:
Int
,
l
:
List
)
:
Boolean
=
(
l
match
{
def
lessThanAll
(
x
:
Big
Int
,
l
:
List
)
:
Boolean
=
(
l
match
{
case
Nil
()
=>
true
case
Nil
()
=>
true
case
Cons
(
y
,
ys
)
=>
if
(
x
<
y
)
lessThanAll
(
x
,
ys
)
else
false
case
Cons
(
y
,
ys
)
=>
if
(
x
<
y
)
lessThanAll
(
x
,
ys
)
else
false
})
ensuring
(
res
=>
!
res
||
!
contains
(
l
,
x
))
})
ensuring
(
res
=>
!
res
||
!
contains
(
l
,
x
))
...
@@ -127,7 +130,7 @@ object SortedList {
...
@@ -127,7 +130,7 @@ object SortedList {
def
discard
(
value
:
Boolean
)
=
true
def
discard
(
value
:
Boolean
)
=
true
@induct
@induct
def
ltaLemma
(
x
:
Int
,
y
:
Int
,
l
:
List
)
:
Boolean
=
{
def
ltaLemma
(
x
:
Big
Int
,
y
:
Big
Int
,
l
:
List
)
:
Boolean
=
{
require
(
lessThanAll
(
y
,
l
)
&&
x
<
y
)
require
(
lessThanAll
(
y
,
l
)
&&
x
<
y
)
lessThanAll
(
x
,
Cons
(
y
,
l
))
lessThanAll
(
x
,
Cons
(
y
,
l
))
}
holds
}
holds
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment