use oxilean_kernel::{BinderInfo, Declaration, Environment, Expr, Level, Name};
use super::functions::*;
#[allow(dead_code)]
pub fn arr_ext_prefix_sum_correct_ty() -> Expr {
implicit_pi(
"n",
nat_ty(),
default_pi("arr", array_of(nat_ty(), Expr::BVar(0)), prop()),
)
}
#[allow(dead_code)]
pub fn arr_ext_diff_array_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"arr",
array_of(Expr::BVar(1), Expr::BVar(0)),
array_of(Expr::BVar(2), Expr::BVar(1)),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_sparse_table_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
inst_pi(
"inst",
ord_of(Expr::BVar(1)),
default_pi("arr", array_of(Expr::BVar(2), Expr::BVar(1)), type1()),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_rmq_correct_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
inst_pi(
"inst",
ord_of(Expr::BVar(1)),
default_pi("arr", array_of(Expr::BVar(2), Expr::BVar(1)), prop()),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_array2d_ty() -> Expr {
default_pi(
"α",
type1(),
default_pi("rows", nat_ty(), default_pi("cols", nat_ty(), type1())),
)
}
#[allow(dead_code)]
pub fn arr_ext_transpose_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"r",
nat_ty(),
implicit_pi(
"c",
nat_ty(),
default_pi(
"m",
app3(
Expr::Const(Name::str("Array2D"), vec![]),
Expr::BVar(2),
Expr::BVar(1),
Expr::BVar(0),
),
type1(),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_rotate_left_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"k",
nat_ty(),
default_pi(
"arr",
array_of(Expr::BVar(2), Expr::BVar(1)),
array_of(Expr::BVar(3), Expr::BVar(2)),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_rotate_right_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"k",
nat_ty(),
default_pi(
"arr",
array_of(Expr::BVar(2), Expr::BVar(1)),
array_of(Expr::BVar(3), Expr::BVar(2)),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_rotate_inverse_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
implicit_pi(
"k",
nat_ty(),
default_pi("arr", array_of(Expr::BVar(2), Expr::BVar(1)), prop()),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_suffix_array_ty() -> Expr {
implicit_pi(
"n",
nat_ty(),
default_pi(
"str",
array_of(nat_ty(), Expr::BVar(0)),
array_of(nat_ty(), Expr::BVar(1)),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_suffix_array_correct_ty() -> Expr {
implicit_pi(
"n",
nat_ty(),
default_pi("str", array_of(nat_ty(), Expr::BVar(0)), prop()),
)
}
#[allow(dead_code)]
pub fn arr_ext_convolution_ty() -> Expr {
implicit_pi(
"n",
nat_ty(),
default_pi(
"a",
array_of(nat_ty(), Expr::BVar(0)),
default_pi(
"b",
array_of(nat_ty(), Expr::BVar(1)),
array_of(nat_ty(), Expr::BVar(2)),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_fft_conv_correct_ty() -> Expr {
implicit_pi(
"n",
nat_ty(),
default_pi(
"a",
array_of(nat_ty(), Expr::BVar(0)),
default_pi("b", array_of(nat_ty(), Expr::BVar(1)), prop()),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_persistent_array_ty() -> Expr {
default_pi("α", type1(), default_pi("n", nat_ty(), type1()))
}
#[allow(dead_code)]
pub fn arr_ext_persistent_get_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"pa",
app2(
Expr::Const(Name::str("PersistentArray"), vec![]),
Expr::BVar(1),
Expr::BVar(0),
),
default_pi("i", fin_of(Expr::BVar(1)), Expr::BVar(3)),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_persistent_set_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"pa",
app2(
Expr::Const(Name::str("PersistentArray"), vec![]),
Expr::BVar(1),
Expr::BVar(0),
),
default_pi(
"i",
fin_of(Expr::BVar(1)),
default_pi(
"v",
Expr::BVar(3),
app2(
Expr::Const(Name::str("PersistentArray"), vec![]),
Expr::BVar(4),
Expr::BVar(3),
),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_chunks_of_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"k",
nat_ty(),
default_pi(
"arr",
array_of(Expr::BVar(2), Expr::BVar(1)),
list_of(list_of(Expr::BVar(3))),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_chunks_cover_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
implicit_pi(
"k",
nat_ty(),
default_pi("arr", array_of(Expr::BVar(2), Expr::BVar(1)), prop()),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_par_map_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"β",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"f",
arrow(Expr::BVar(2), Expr::BVar(1)),
default_pi(
"arr",
array_of(Expr::BVar(3), Expr::BVar(1)),
array_of(Expr::BVar(3), Expr::BVar(2)),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_par_map_correct_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"β",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"f",
arrow(Expr::BVar(2), Expr::BVar(1)),
default_pi("arr", array_of(Expr::BVar(3), Expr::BVar(1)), prop()),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_par_reduce_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"op",
arrow(Expr::BVar(1), arrow(Expr::BVar(2), Expr::BVar(2))),
default_pi(
"init",
Expr::BVar(2),
default_pi("arr", array_of(Expr::BVar(3), Expr::BVar(2)), Expr::BVar(4)),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_scan_left_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"β",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"f",
arrow(Expr::BVar(1), arrow(Expr::BVar(3), Expr::BVar(2))),
default_pi(
"init",
Expr::BVar(2),
default_pi(
"arr",
array_of(Expr::BVar(4), Expr::BVar(2)),
array_of(Expr::BVar(4), nat_succ(Expr::BVar(3))),
),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_map_fuse_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"β",
type1(),
implicit_pi(
"γ",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"g",
arrow(Expr::BVar(2), Expr::BVar(1)),
default_pi(
"f",
arrow(Expr::BVar(4), Expr::BVar(3)),
default_pi("arr", array_of(Expr::BVar(5), Expr::BVar(2)), prop()),
),
),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_filter_map_fuse_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"β",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"f",
arrow(Expr::BVar(2), option_of(Expr::BVar(1))),
default_pi("arr", array_of(Expr::BVar(3), Expr::BVar(1)), prop()),
),
),
),
)
}
#[allow(dead_code)]
pub fn arr_ext_fold_map_fuse_ty() -> Expr {
implicit_pi(
"α",
type1(),
implicit_pi(
"β",
type1(),
implicit_pi(
"γ",
type1(),
implicit_pi(
"n",
nat_ty(),
default_pi(
"g",
arrow(Expr::BVar(2), arrow(Expr::BVar(2), Expr::BVar(2))),
default_pi(
"z",
Expr::BVar(3),
default_pi(
"f",
arrow(Expr::BVar(5), Expr::BVar(4)),
default_pi("arr", array_of(Expr::BVar(6), Expr::BVar(3)), prop()),
),
),
),
),
),
),
)
}
pub fn register_array_extended(env: &mut Environment) -> Result<(), String> {
let axioms: &[(&str, Expr)] = &[
("Array.map_id", arr_ext_map_id_ty()),
("Array.map_comp", arr_ext_map_comp_ty()),
("Array.pure_map_size", arr_ext_pure_map_size_ty()),
("Array.bind_assoc", arr_ext_bind_assoc_ty()),
("Array.mergesort", arr_ext_mergesort_ty()),
("Array.sort_stable", arr_ext_sort_stable_ty()),
("Array.sort_perm", arr_ext_sort_perm_ty()),
("Array.sort_sorted", arr_ext_sort_sorted_ty()),
("Array.qsort_average_case", arr_ext_qsort_avg_ty()),
("Array.reverse_involution", arr_ext_reverse_involution_ty()),
("Array.reverse_size", arr_ext_reverse_size_ty()),
("Array.append_assoc", arr_ext_append_assoc_ty()),
("Array.append_empty_left", arr_ext_append_empty_left_ty()),
("Array.append_empty_right", arr_ext_append_empty_right_ty()),
("Array.append_size", arr_ext_append_size_ty()),
("Array.slice", arr_ext_slice_ty()),
("Array.prefix_sum", arr_ext_prefix_sum_ty()),
("Array.prefix_sum_correct", arr_ext_prefix_sum_correct_ty()),
("Array.diff_array", arr_ext_diff_array_ty()),
("Array.sparse_table", arr_ext_sparse_table_ty()),
("Array.rmq_correct", arr_ext_rmq_correct_ty()),
("Array2D", arr_ext_array2d_ty()),
("Array2D.transpose", arr_ext_transpose_ty()),
("Array.rotate_left", arr_ext_rotate_left_ty()),
("Array.rotate_right", arr_ext_rotate_right_ty()),
("Array.rotate_inverse", arr_ext_rotate_inverse_ty()),
("Array.suffix_array", arr_ext_suffix_array_ty()),
(
"Array.suffix_array_correct",
arr_ext_suffix_array_correct_ty(),
),
("Array.convolution", arr_ext_convolution_ty()),
("Array.fft_conv_correct", arr_ext_fft_conv_correct_ty()),
("PersistentArray", arr_ext_persistent_array_ty()),
("PersistentArray.get", arr_ext_persistent_get_ty()),
("PersistentArray.set", arr_ext_persistent_set_ty()),
("Array.chunksOf", arr_ext_chunks_of_ty()),
("Array.chunks_cover", arr_ext_chunks_cover_ty()),
("Array.par_map", arr_ext_par_map_ty()),
("Array.par_map_correct", arr_ext_par_map_correct_ty()),
("Array.par_reduce", arr_ext_par_reduce_ty()),
("Array.scan_left", arr_ext_scan_left_ty()),
("Array.map_fuse", arr_ext_map_fuse_ty()),
("Array.filter_map_fuse", arr_ext_filter_map_fuse_ty()),
("Array.fold_map_fuse", arr_ext_fold_map_fuse_ty()),
];
for (name, ty) in axioms {
env.add(Declaration::Axiom {
name: Name::str(*name),
univ_params: vec![],
ty: ty.clone(),
})
.ok();
}
Ok(())
}
#[allow(dead_code)]
pub fn merge_sort(data: &[i64]) -> Vec<i64> {
if data.len() <= 1 {
return data.to_vec();
}
let mid = data.len() / 2;
let left = merge_sort(&data[..mid]);
let right = merge_sort(&data[mid..]);
let mut result = Vec::with_capacity(data.len());
let (mut i, mut j) = (0, 0);
while i < left.len() && j < right.len() {
if left[i] <= right[j] {
result.push(left[i]);
i += 1;
} else {
result.push(right[j]);
j += 1;
}
}
result.extend_from_slice(&left[i..]);
result.extend_from_slice(&right[j..]);
result
}