diff --git a/src/analyze/annot.rs b/src/analyze/annot.rs
index 390518dc..440783f3 100644
--- a/src/analyze/annot.rs
+++ b/src/analyze/annot.rs
@@ -162,6 +162,14 @@ pub fn seq_push_path() -> [Symbol; 3] {
]
}
+pub fn seq_subsequence_path() -> [Symbol; 3] {
+ [
+ Symbol::intern("thrust"),
+ Symbol::intern("def"),
+ Symbol::intern("seq_subsequence"),
+ ]
+}
+
pub fn seq_concat_path() -> [Symbol; 3] {
[
Symbol::intern("thrust"),
diff --git a/src/analyze/annot_fn.rs b/src/analyze/annot_fn.rs
index 92a8b2c7..8ba6ef81 100644
--- a/src/analyze/annot_fn.rs
+++ b/src/analyze/annot_fn.rs
@@ -852,6 +852,16 @@ impl<'a, 'tcx> AnnotFnTranslator<'a, 'tcx> {
let new_len = len.add(chc::Term::int(1));
return FormulaOrTerm::Term(chc::Term::tuple(vec![new_arr, new_len]));
}
+ if Some(def_id) == self.def_ids.seq_subsequence() {
+ assert_eq!(args.len(), 2, "Seq::subsequence takes exactly 2 arguments");
+ let t = self.to_term(receiver);
+ let start = self.to_term(&args[0]);
+ let end = self.to_term(&args[1]);
+ let arr = t.tuple_proj(0);
+ let new_len = end.sub(start.clone());
+ let new_arr = chc::Term::subarray(arr, start, new_len.clone());
+ return FormulaOrTerm::Term(chc::Term::tuple(vec![new_arr, new_len]));
+ }
if Some(def_id) == self.def_ids.seq_concat() {
assert_eq!(args.len(), 1, "Seq::concat takes exactly 1 argument");
let elem_sort = self.adt_arg_type_at(receiver, 0).to_sort();
diff --git a/src/analyze/did_cache.rs b/src/analyze/did_cache.rs
index d29f8510..967c4ad4 100644
--- a/src/analyze/did_cache.rs
+++ b/src/analyze/did_cache.rs
@@ -29,6 +29,7 @@ struct DefIds {
seq_singleton: OnceCell