z3-src 503.2.1

Source distribution of the Z3 SMT solver, for use as a build dependency
Documentation
/*++
Copyright (c) 2026 Microsoft Corporation

Module Name:

    seq_subset.h

Abstract:

    Heuristic regular-expression subset checks used by seq_rewriter.

Author:

    Nikolaj Bjorner (nbjorner) 2026-6-8

--*/
#pragma once

#include "ast/seq_decl_plugin.h"

class seq_subset {
    seq_util::rex& m_re;
    static constexpr unsigned m_max_depth = 3;

    bool is_subset_rec(expr* a, expr* b, unsigned depth) const;

    // true if regex a, viewed as a flattened concatenation, has suf as a
    // structural (concatenation) suffix.
    bool ends_with(expr* a, expr* suf) const;

    void flatten_concat(expr* a, ptr_vector<expr>& out) const;

public:
    explicit seq_subset(seq_util::rex& re) : m_re(re) {}
    bool is_subset(expr* a, expr* b) const;
};