Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
POTTIER Francois
menhir
Commits
6a638bf9
Commit
6a638bf9
authored
Sep 10, 2019
by
POTTIER Francois
Browse files
New function [Misc.trim] (unused on master).
parent
f4ca49f4
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/misc.ml
View file @
6a638bf9
...
...
@@ -347,6 +347,36 @@ let levels cmp xs =
let
ys1
,
yss
=
levels1
cmp
x1
xs
in
ys1
::
yss
(* Suppose [ys] is a list of elements that are pairwise incomparable
with respect to the partial order [<=], and [x] is a new element.
Then, [insert (<=) x ys] is the list obtained by inserting [x] and
removing any non-maximal elements; so it is again a list of pairwise
incomparable elements. *)
let
insert
(
<=
)
x
ys
=
(* If [x] is subsumed by some element [y] of [ys], then there is nothing
to do. In particular, no element [y] of [ys] can be subsumed by [x],
since the elements of [ys] are pairwise incomparable. *)
if
List
.
exists
(
fun
y
->
x
<=
y
)
ys
then
ys
(* Or [x] must be inserted, and any element [y] of [ys] that is subsumed
by [x] must be removed. *)
else
x
::
List
.
filter
(
fun
y
->
not
(
y
<=
x
))
ys
(* Suppose [xs] is an arbitrary list of elements. Then [trim (<=) xs] is the
sublist of the elements of [xs] that are maximal with respect to the
partial order [<=]. In other words, it is a sublist where every element
that is less than some other element has been removed. *)
(* One might wish to define [trim] using [List.filter] to keep just the
maximal elements, but it is not so easy to say "keep an element only
if it is not subsumed by some *other* element of the list". Instead,
we iterate [insert]. *)
let
trim
(
<=
)
xs
=
List
.
fold_right
(
insert
(
<=
))
xs
[]
let
rec
dup1
cmp
x
ys
=
match
ys
with
|
[]
->
...
...
src/misc.mli
View file @
6a638bf9
...
...
@@ -167,6 +167,13 @@ val best: ('a -> 'a -> bool) -> 'a list -> 'a option
val
levels
:
(
'
a
->
'
a
->
int
)
->
'
a
list
->
'
a
list
list
(* Suppose [xs] is an arbitrary list of elements. Then [trim (<=) xs] is the
sublist of the elements of [xs] that are maximal with respect to the
partial order [<=]. In other words, it is a sublist where every element
that is less than some other element has been removed. *)
val
trim
:
(
'
a
->
'
a
->
bool
)
->
'
a
list
->
'
a
list
(* Assuming that the list [xs] is sorted with respect to the ordering [cmp],
[dup cmp xs] returns a duplicate element of the list [xs], if one exists. *)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment