(ns nal.deriver.premises-swapping
  (:require [nal.deriver.key-path :refer [rule-path]]
            [nal.deriver.normalization :refer [commutative-ops]]))

the set of keys which prevent premises swapping for rule

(def anti-swapping-keys
  #{:question? :belief? :goal? :measure-time :t/belief-structural-deduction
    :t/structural-deduction :t/belief-structural-difference :t/identity
    :t/negation :union :intersection :t/intersection :t/union})

Checks if rule allow swapping of premises.

(defn allow-swapping?
  [{:keys [pre conclusions]}]
  (let [{:keys [post conclusion]} (first conclusions)]
    (and (not-any? anti-swapping-keys (flatten (concat pre post)))
         (not-any? commutative-ops (flatten conclusion)))))
(defn swap-premises
  [{:keys [p1 p2] :as rule}]
  (assoc rule :p1 p2
              :p2 p1
              :full-path (rule-path p2 p1)))
(defn swap [rule] [rule (swap-premises rule)])