cop/lean/clause.rs
1use crate::fof::Dnf;
2use crate::{Clause, Lit};
3use alloc::vec::Vec;
4
5impl<P, C, V> Clause<Lit<P, C, V>> {
6 /// All variables occurring in a clause.
7 pub fn vars(&self) -> impl Iterator<Item = &V> {
8 self.iter().flat_map(|lit| lit.vars())
9 }
10}
11
12impl<L: Eq> From<Dnf<L>> for Clause<L> {
13 fn from(fm: Dnf<L>) -> Self {
14 match fm {
15 Dnf::Disj(fms) => {
16 let fms = fms.into_iter().rev().map(Self::from);
17 fms.reduce(|acc, x| x.union(acc)).unwrap_or_default()
18 }
19 Dnf::Lit(lit) => Self(Vec::from([lit])),
20 }
21 }
22}