TPTP Axioms File: MGT002+7.ax


%--------------------------------------------------------------------------
% File     : MGT002+7 : TPTP v9.3.1. Released v9.3.0.
% Domain   : Management
% Axioms   : Box-level containment (boxS) for policy redundancy detection
% Version  : [Han98] axioms.
% English  : Encodes box-containment. Presence tags (present/absent) track
%            whether each policy constrains a given axis, enabling the 
%            Unknown-when-absent logic. subs_verdict/6: per-axis 
%            subsumption with presence flags. box_subs/2: binary 
%            aggregation of subs_verdict values; apply iteratively: 
%            box_subs(box_subs(box_subs(S1,S2),S3),S4). Asymmetric: 
%            box_subs(C1,C2) checks C1 is stricter than C2; box_subs(C2,C1)
%            checks the reverse.

% Refs     : [MC+26] Mustafa et al. (2026), Axis Decomposition for ODRL
% Source   : [MC+26]
% Names    : SUBS000-0.ax [MC+26]

% Status   : Satisfiable
% Syntax   : Number of formulae    :   14 (   6 unt;   0 def)
%            Number of atoms       :   40 (  25 equ)
%            Maximal formula atoms :    7 (   2 avg)
%            Number of connectives :   31 (   5   ~;   6   |;  12   &)
%                                         (   0 <=>;   8  =>;   0  <=;   0 <~>)
%            Maximal formula depth :   10 (   5 avg)
%            Maximal term depth    :    2 (   1 avg)
%            Number of predicates  :    4 (   3 usr;   0 prp; 1-4 aty)
%            Number of functors    :    7 (   7 usr;   5 con; 0-6 aty)
%            Number of variables   :   35 (  35   !;   0   ?)
% SPC      : FOF_SAT_RFO_SEQ

% Comments : Requires AXIS001+1.ax and ORD000-0.ax. Continuous domains
%            also requires ORD001-0.ax.
%--------------------------------------------------------------------------
%----Presence tags
%----Encode whether a given policy constrains an axis.
%----Used to implement the Unknown-when-absent logic of def:box-containment.
fof(present_is_presence,axiom,
    is_presence(present) ).

fof(absent_is_presence,axiom,
    is_presence(absent) ).

fof(presence_distinct,axiom,
    present != absent ).

fof(presence_enum,axiom,
    ! [T] :
      ( is_presence(T)
     => ( T = present
        | T = absent ) ) ).

%----Per-axis subsumption verdict with presence
%----subs_verdict(L1,H1,P1, L2,H2,P2):
%----  S_k = Unknown  when C1 or C2 does not constrain axis a_k
%----  S_k = Compatible when both present and sem(C1) subseteq sem(C2)
%----  S_k = Conflict   when both present and sem(C1) not-subseteq sem(C2)
%
%----Note: absence of C2 also yields Unknown (not vacuously Compatible),
%----because the absent policy's intended scope is not known (paper text).
fof(subs_c1_absent,axiom,
    ! [L1,H1,L2,H2] : subs_verdict(L1,H1,absent,L2,H2,present) = unknown ).

fof(subs_c2_absent,axiom,
    ! [L1,H1,L2,H2] : subs_verdict(L1,H1,present,L2,H2,absent) = unknown ).

fof(subs_both_absent,axiom,
    ! [L1,H1,L2,H2] : subs_verdict(L1,H1,absent,L2,H2,absent) = unknown ).

fof(subs_present_yes,axiom,
    ! [L1,H1,L2,H2] :
      ( axis_subsumes(L1,H1,L2,H2)
     => subs_verdict(L1,H1,present,L2,H2,present) = compatible ) ).

fof(subs_present_no,axiom,
    ! [L1,H1,L2,H2] :
      ( ~ axis_subsumes(L1,H1,L2,H2)
     => subs_verdict(L1,H1,present,L2,H2,present) = conflict ) ).

fof(subs_verdict_total,axiom,
    ! [L1,H1,P1,L2,H2,P2] :
      ( ( is_presence(P1)
        & is_presence(P2) )
     => ( subs_verdict(L1,H1,P1,L2,H2,P2) = compatible
        | subs_verdict(L1,H1,P1,L2,H2,P2) = conflict
        | subs_verdict(L1,H1,P1,L2,H2,P2) = unknown ) ) ).

%----Box-level containment aggregation
%----box_subs/2 is BINARY; apply iteratively over all per-axis verdicts:
%----  box_subs(box_subs(box_subs(S1,S2),S3),S4)  for 4 axes.
%
%----box_subs(V1,V2) aggregates per-axis subs_verdict values:
%----  Compatible iff both V1 and V2 are Compatible
%----  Conflict   iff at least one of V1, V2 is Conflict
%----  Unknown    otherwise (mixed Compatible/Unknown, no Conflict)
%
%----ASYMMETRIC by design: box_subs(V1,V2) != box_subs(V2,V1) in general,
%----matching the asymmetry of containment vs. reverse containment.
fof(box_subs_compat,axiom,
    ! [V1,V2] :
      ( ( is_verdict(V1)
        & is_verdict(V2)
        & V1 = compatible
        & V2 = compatible )
     => box_subs(V1,V2) = compatible ) ).

fof(box_subs_conflict,axiom,
    ! [V1,V2] :
      ( ( is_verdict(V1)
        & is_verdict(V2)
        & ( V1 = conflict
          | V2 = conflict ) )
     => box_subs(V1,V2) = conflict ) ).

fof(box_subs_unknown,axiom,
    ! [V1,V2] :
      ( ( is_verdict(V1)
        & is_verdict(V2)
        & ~ ( V1 = compatible
            & V2 = compatible )
        & V1 != conflict
        & V2 != conflict )
     => box_subs(V1,V2) = unknown ) ).

fof(box_subs_total,axiom,
    ! [V1,V2] :
      ( ( is_verdict(V1)
        & is_verdict(V2) )
     => ( box_subs(V1,V2) = compatible
        | box_subs(V1,V2) = conflict
        | box_subs(V1,V2) = unknown ) ) ).

%--------------------------------------------------------------------------