theory TNEMO imports FOL
begin
typedecl Ob
typedecl Ti
arities Ob :: "term"
Ti :: "term"
(* temporal non-extensional mereology of objects *)
consts
O :: "Ob => Ob => Ti => o"
P :: "Ob => Ob => Ti => o"
PP :: "Ob => Ob => Ti => o"
E :: "Ob => Ti => o"
Me :: "Ob => Ob => Ti => o"
pP :: "Ob => Ob => o"
pPP :: "Ob => Ob => o"
pO :: "Ob => Ob => o"
pMe :: "Ob => Ob => o"
cP :: "Ob => Ob => o"
bP :: "Ob => Ob => o"
axioms
P_exists1: "(ALL x. (EX t. E(x,t)))"
P_exists2: "(ALL x y t. (P(x,y,t) -->(E(x,t) & E(y,t))))"
P_trans: "(ALL x y z t. (P(x,y,t) & P(y,z,t) --> P(x,z,t)))"
P_ssuppl: "(ALL x y t. ((E(x,t) & ~P(x,y,t)) --> (EX z. (P(z,x,t) & ~O(z,y,t)))))"
defs
E_def: "E(x,t) == P(x,x,t)"
O_def: "O(x,y,t) == (EX z. (P(z,x,t) & P(z,y,t)))"
PP_def: "PP(x,y,t) == P(x,y,t) & ~P(y,x,t)"
Me_def: "Me(x,y,t) == (P(x,y,t) & P(y,x,t))"
pP_def: "pP(x,y) == (ALL t. ((E(x,t) | E(y,t)) --> P(x,y,t)))"
pPP_def: "pPP(x,y) == (ALL t. ((E(x,t) | E(y,t)) --> PP(x,y,t)))"
pO_def: "pO(x,y) == (ALL t. ((E(x,t) | E(y,t)) --> O(x,y,t)))"
pMe_def: "pMe(x,y) == (ALL t. ((E(x,t) | E(y,t)) --> Me(x,y,t)))"
cP_def: "cP(x,y) == (ALL t. (E(y,t) --> P(x,y,t)))"
bP_def: "bP(x,y) == (ALL t. (E(x,t) --> P(x,y,t)))"
(* axioms as rules *)
lemma P_exists2_rule: "P(x,y,t) ==>(E(x,t) & E(y,t))"
apply(insert P_exists2)
apply(auto)
done
lemma P_trans_rule: "[|P(x,y,t); P(y,z,t)|] ==> P(x,z,t)"
apply(insert P_trans)
apply(erule allE,erule allE,erule allE,erule allE)
apply(rule mp)
apply(assumption)
apply(rule conjI)
apply(assumption)
apply(assumption)
done
lemma P_Me_rule: "[|P(x,y,t);P(y,x,t)|] ==> Me(x,y,t)"
apply(drule conjI)
apply(assumption)
apply(fold Me_def)
apply(assumption)
done
lemma P_ssuppl_rule: "[|E(x,t);~P(x,y,t)|] ==> (EX z. (P(z,x,t) & ~O(z,y,t)))"
apply(insert P_ssuppl)
apply(auto)
done
lemma ltb2: "(~(A & ~B) ==> (~A | B))"
apply(auto)
done
lemma P_ssuppl_rule_transpos: "~(EX z. (P(z,x,t) & ~O(z,y,t))) ==> (~E(x,t) | P(x,y,t))"
apply(insert P_ssuppl)
apply(rule ltb2)
apply(rule notI)
apply(auto)
done
(* theorems of non-extensional temporal mereology *)
theorem P_refl: "E(x,t) ==> P(x,x,t)"
apply(unfold E_def)
apply(assumption)
done
theorem Me_refl: "E(x,t) ==> Me(x,x,t)"
apply(unfold Me_def)
apply(unfold E_def)
apply(auto)
done
theorem Me_exists2: "Me(x,y,t) ==> (E(x,t) & E(y,t))"
apply(unfold Me_def)
apply(rule conjI)
apply(erule conjE)
apply(drule P_exists2_rule)
apply(auto)
apply(drule P_exists2_rule)
apply(auto)
done
theorem Me_sym: "Me(x,y,t) ==> Me(y,x,t)"
apply(unfold Me_def)
apply(auto)
done
theorem Me_trans: "[|Me(x,y,t); Me(y,z,t)|] ==> Me(x,z,t)"
apply(unfold Me_def)
apply(rule conjI)
apply(erule conjE,erule conjE)
apply(erule P_trans_rule)
apply(assumption)
apply(erule conjE,erule conjE)
apply(erule P_trans_rule)
apply(assumption)
done
theorem O_refl: "(ALL x t. E(x,t) --> O(x,x,t))"
apply(rule allI,rule allI)
apply(unfold E_def)
apply(unfold O_def)
apply(auto)
done
lemma O_refl_rule: "E(x,t) ==> O(x,x,t)"
apply(insert O_refl)
apply(auto)
done
theorem O_sym: "(ALL x y t. (O(x,y,t) --> O(y,x,t)))"
apply(unfold O_def)
apply(auto)
done
lemma O_sym_rule: "O(x,y,t) ==> O(y,x,t)"
apply(insert O_sym)
apply(auto)
done
theorem O_imp_E_and_E: "O(x,y,t) ==> (E(x,t) & E(y,t))"
apply(rule conjI)
apply(unfold O_def)
apply(erule exE)
apply(erule conjE)
apply(drule P_exists2_rule)
apply(auto)
apply(rotate_tac 1)
apply(drule P_exists2_rule)
apply(auto)
done
theorem PP_imp_P: "(ALL x y t. (PP(x,y,t) --> P(x,y,t)))"
apply(unfold PP_def)
apply(auto)
done
lemma PP_imp_P_rule: "PP(x,y,t) ==> P(x,y,t)"
apply(unfold PP_def)
apply(auto)
done
theorem P_imp_Me_or_PP: "P(x,y,t) ==> (Me(x,y,t) | PP(x,y,t))"
apply(unfold PP_def,unfold Me_def)
apply(auto)
done
theorem PP_or_Me_imp_P: "(PP(x,y,t) | Me(x,y,t)) ==> P(x,y,t)"
apply(unfold Me_def)
apply(safe)
apply(drule PP_imp_P_rule)
apply(assumption)
done
theorem PP_asym: "(ALL x y t. PP(x,y,t) --> ~PP(y,x,t))"
apply(unfold PP_def)
apply(auto)
done
lemma PP_asym_rule: "PP(x,y,t) ==> ~PP(y,x,t)"
apply(insert PP_asym)
apply(auto)
done
theorem PP_trans: "(ALL x y z t. (PP(x,y,t) & PP(y,z,t)-->PP(x,z,t)))"
apply(rule allI, rule allI, rule allI,rule allI)
apply(rule impI)
apply(unfold PP_def)
apply(rule conjI)
apply(erule conjE,erule conjE,erule conjE)
apply(rule P_trans_rule)
apply(assumption)
apply(assumption)
apply(erule conjE, erule conjE, erule conjE)
apply(drule P_trans_rule)
apply(assumption)
apply(rule notI)
apply(drule P_trans_rule)
apply(assumption)
apply(erule notE)
apply(assumption)
done
lemma PP_trans_rule: assumes p1: "PP(x,y,t)" assumes p2: "PP(y,z,t)" shows "PP(x,z,t)"
apply(insert PP_trans)
apply(erule allE, erule allE,erule allE,erule allE)
apply(rule mp)
apply(assumption)
apply(rule conjI)
apply(insert p1)
apply(assumption)
apply(insert p2)
apply(assumption)
done
theorem P_and_PP_imp_PP: "[|P(x,y,t);PP(y,z,t)|] ==> PP(x,z,t)"
apply(drule P_imp_Me_or_PP)
apply(safe)
apply(unfold Me_def)
apply(clarify)
prefer 2
apply(drule PP_trans_rule [of x y t z])
apply(assumption)
apply(assumption)
apply(unfold PP_def)
apply(safe)
apply(drule P_trans_rule [of x y t z])
apply(assumption)
apply(assumption)
apply(drule P_trans_rule [of z x t y])
apply(auto)
done
theorem PP_and_P_imp_PP: "[|PP(x,y,t);P(y,z,t)|] ==> PP(x,z,t)"
apply(drule P_imp_Me_or_PP)
apply(safe)
apply(unfold Me_def)
apply(clarify)
prefer 2
apply(drule PP_trans_rule [of x y t z])
apply(assumption)
apply(assumption)
apply(unfold PP_def)
apply(safe)
apply(drule P_trans_rule [of x y t z])
apply(assumption)
apply(assumption)
apply(drule P_trans_rule [of y z t x])
apply(auto)
done
(* from now on we only use the rule notation wherever possible *)
theorem P_and_notMe_imp_PP: "[|P(x,y,t);~Me(x,y,t)|] ==> PP(x,y,t)"
apply(unfold Me_def,unfold PP_def)
apply(auto)
done
theorem P_imp_O: "P(x,y,t) ==> O(x,y,t)"
apply(unfold O_def)
apply(rule exI)
apply(rule conjI)
apply(drule P_exists2_rule)
apply(erule conjE)
apply(unfold E_def)
apply(assumption)
apply(assumption)
done
theorem P_and_O: "[|P(x,y,t);O(x,z,t)|] ==> O(y,z,t)"
apply(unfold O_def)
apply(erule exE)
apply(rule exI)
apply(rule conjI)
apply(erule conjE)
prefer 2
apply(erule conjE)
apply(assumption)
apply(rule P_trans_rule)
apply(assumption)
apply(assumption)
done
theorem O_imp_O_imp_P: "(ALL x y t. (E(x,t) & (ALL z. (O(z,x,t) --> O(z,y,t))) --> P(x,y,t)))"
apply(rule allI,rule allI,rule allI)
apply(rule impI)
apply(erule conjE)
apply(rule_tac P="~E(x,t)" and Q="P(x,y,t)" in disjE)
apply(rule P_ssuppl_rule_transpos)
apply(rule notI)
apply(erule exE)
apply(erule allE)
apply(erule conjE)
apply(drule P_imp_O)
apply(drule mp)
apply(assumption)
apply(erule notE)
apply(assumption)
apply(erule_tac R="P(x,y,t)" in notE)
apply(assumption)
apply(assumption)
done
lemma O_imp_O_imp_P_rule: "[|E(x,t);(ALL z. (O(z,x,t) --> O(z,y,t)))|] ==> P(x,y,t)"
apply(insert O_imp_O_imp_P)
apply(auto)
done
lemma ltb1: "(ALL z. (A(z,x,t) & B(z,y,t))) ==> (ALL z. A(z,x,t)) & (ALL z. B(z,y,t))"
apply(auto)
done
theorem O_iff_O_iff_Me : "(ALL x y t. ((E(x,t) & E(y,t) & (ALL z. (O(z,x,t) <-> O(z,y,t)))) <-> Me(x,y,t)))"
apply(rule allI,rule allI,rule allI)
apply(unfold iff_def)
apply(rule conjI)
apply(rule impI)
apply(unfold Me_def)
apply(erule conjE,erule conjE)
apply(drule ltb1)
apply(erule conjE)
apply(rule conjI)
apply(drule O_imp_O_imp_P_rule)
prefer 2
apply(assumption)
apply(assumption)
apply(drule_tac x="y" and y="x" in O_imp_O_imp_P_rule)
prefer 2
apply(assumption)
apply(assumption)
apply(auto)
apply(drule P_exists2_rule)
apply(erule conjE)
apply(assumption)
apply(drule P_exists2_rule)
apply(erule conjE)
apply(assumption)
apply(drule P_and_O)
apply(drule O_sym_rule)
apply(assumption)
apply(rule O_sym_rule)
apply(assumption)
apply(drule_tac x="y" and y="x" in P_and_O)
apply(drule O_sym_rule)
apply(assumption)
apply(rule O_sym_rule)
apply(assumption)
done
theorem P_iff_P_iff_Me: "(ALL x y t. ((E(x,t) & E(y,t) & (ALL z. (P(z,x,t) <-> P(z,y,t)))) <-> Me(x,y,t)))"
apply(rule allI,rule allI,rule allI)
apply(rule iffI)
apply(erule conjE,erule conjE)
apply(unfold Me_def)
apply(unfold E_def)
apply(rule conjI)
apply(erule_tac x="x" in allE)
apply(erule iffE)
apply(drule_tac P="P(x, x, t)" and Q="P(x, y, t)" in mp)
apply(assumption)
apply(assumption)
apply(erule_tac x="y" in allE)
apply(erule iffE)
apply(drule_tac P="P(y, y, t)" and Q="P(y, x, t)" in mp)
apply(assumption)
apply(assumption)
apply(rule conjI)
apply(fold E_def)
apply(fold Me_def)
apply(drule Me_exists2)
apply(erule conjE)
apply(assumption)
apply(rule conjI)
apply(drule Me_exists2)
apply(erule conjE)
apply(assumption)
apply(rule allI)
apply(rule iffI)
apply(unfold Me_def)
apply(erule conjE)
apply(drule_tac x="z" and y="x" and z="y" in P_trans_rule)
apply(assumption)
apply(assumption)
apply(erule conjE)
apply(drule_tac x="z" and y="y" and z="x" in P_trans_rule)
apply(auto)
done
theorem pP_refl: "ALL x. pP(x,x)"
apply(unfold pP_def)
apply(unfold E_def)
apply(auto)
done
theorem pP_trans: "[|pP(x,y);pP(y,z)|] ==> pP(x,z)"
apply(unfold pP_def)
apply(auto)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(drule_tac P="E(x,t)" and Q="E(y,t)" in disjI1)
apply(clarify)
apply(frule P_exists2_rule)
apply(auto)
apply(rule_tac x="x" and y="y" and z="z" and t="t" in P_trans_rule)
apply(assumption, assumption)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(drule_tac P="E(y,t)" and Q="E(z,t)" in disjI2)
apply(clarify)
apply(frule P_exists2_rule)
apply(auto)
apply(rule_tac x="x" and y="y" and z="z" and t="t" in P_trans_rule)
apply(assumption, assumption)
done
theorem pPP_asym: "pPP(x,y) ==> ~pPP(y,x)"
apply(unfold pPP_def)
apply(clarify)
apply(insert P_exists1)
apply(erule_tac x="x" in allE)
apply(erule exE)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(drule_tac P="E(x,t)" and Q="E(y,t)" in disjI1)
apply(clarify)
apply(frule PP_imp_P_rule)
apply(drule P_exists2_rule)
apply(drule PP_asym_rule)
apply(auto)
done
theorem pPP_trans: "[|pPP(x,y);pPP(y,z)|] ==> pPP(x,z)"
apply(unfold pPP_def)
apply(safe)
apply(rule_tac x="x" and y="y" and t="t" in PP_trans_rule)
apply(auto)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(drule_tac P="E(x,t)" and Q="E(y,t)" in disjI1)
apply(drule mp, assumption)
apply(frule PP_imp_P_rule)
apply(drule P_exists2_rule)
apply(auto)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(drule_tac P="E(y,t)" and Q="E(z,t)" in disjI2)
apply(drule mp, assumption)
apply(frule PP_imp_P_rule)
apply(drule P_exists2_rule)
apply(auto)
apply(rule_tac x="x" and y="y" and t="t" in PP_trans_rule)
apply(auto)
done
theorem pPP_imp_pP_and_notpP: "pPP(x,y) ==> (pP(x,y) & ~pP(y,x))"
apply(unfold pPP_def,unfold pP_def)
apply(unfold PP_def)
apply(rule conjI)
apply(safe)
apply(erule_tac x="t" in allE)
apply(force)
apply(erule_tac x="t" in allE)
apply(force)
apply(insert P_exists1)
apply(erule_tac x="x" in allE)
apply(erule exE)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(auto)
done
(* theorem pP_and_notpP_imp_pPP: "[|pP(x,y);~pP(y,x)|] ==> pPP(x,y)"
apply(unfold pP_def,unfold pPP_def)
apply(clarify)
apply(erule_tac x="ta" in allE)
apply(safe)
apply(unfold PP_def)
apply(safe)
at this point it is clear that this is not provable *)
theorem pO_refl: "(ALL x. pO(x,x))"
apply(unfold pO_def)
apply(insert O_refl)
apply(auto)
done
theorem pO_sym: "pO(x,y) ==> pO(y,x)"
apply(unfold pO_def)
apply(insert O_sym)
apply(auto)
done
(* theorem pO_shared_pP: "[|pO(x,y)|] ==> (EX z. (pP(z,x) & pP(z,y)))"
apply(unfold pO_def,unfold pP_def,unfold O_def)
apply(erule_tac x="t" in allE)
apply(insert excluded_middle [of "(E(x, t) | E(y, t))"])
apply(erule disjE)
prefer 2
apply(auto)
apply(rule_tac x="z" in exI)
apply(auto)
at this point it is clear that we cannot prove this
*)
theorem SharedpP_imp_pO: "(EX z. (pP(z,x) & pP(z,y))) ==> pO(x,y)"
apply(unfold pP_def,unfold pO_def)
apply(safe)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(drule_tac P="E(z,t)" and Q="E(x,t)" in disjI2)
apply(clarify)
apply(unfold O_def)
apply(rule_tac x="z" in exI)
apply(frule_tac x="z" and y="x" and t="t" in P_exists2_rule)
apply(safe)
apply(rule_tac x="z" in exI)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(drule_tac P="E(z,t)" and Q="E(y,t)" in disjI2)
apply(clarify)
apply(drule_tac x="z" and y="y" and t="t" in P_exists2_rule)
apply(auto)
done
theorem cP_refl: "(ALL x. (cP(x,x)))"
apply(unfold cP_def)
apply(insert P_exists1)
apply(unfold E_def)
apply(auto)
done
theorem cP_trans: "[|cP(x,y);cP(y,z)|] ==> cP(x,z)"
apply(unfold cP_def)
apply(safe)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(safe)
apply(drule P_exists2_rule)
apply(safe)
apply(drule_tac x="x" and y="y" and z="z" and t="t" in P_trans_rule)
apply(auto)
done
theorem bP_refl: "(ALL x. (bP(x,x)))"
apply(unfold bP_def)
apply(insert P_exists1)
apply(unfold E_def)
apply(auto)
done
theorem bP_trans: "[|bP(x,y);bP(y,z)|] ==> bP(x,z)"
apply(unfold bP_def)
apply(safe)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(safe)
apply(drule P_exists2_rule)
apply(safe)
apply(drule_tac x="x" and y="y" and z="z" and t="t" in P_trans_rule)
apply(auto)
done
theorem pP_imp_cP_and_bP: "pP(x,y) ==> (cP(x,y) & bP(x,y))"
apply(unfold pP_def,unfold cP_def,unfold bP_def)
apply(safe)
apply(erule_tac x="t" in allE)
apply(auto)
done
theorem cP_and_bP_imp_pP: "[|cP(x,y);bP(x,y)|] ==> pP(x,y)"
apply(unfold pP_def,unfold cP_def,unfold bP_def)
apply(safe)
apply(erule_tac x="t" in allE)
apply(erule_tac x="t" in allE)
apply(auto)
done
end
lemma P_exists2_rule:
P(x, y, t) ==> E(x, t) ∧ E(y, t)
lemma P_trans_rule:
[| P(x, y, t); P(y, z, t) |] ==> P(x, z, t)
lemma P_Me_rule:
[| P(x, y, t); P(y, x, t) |] ==> Me(x, y, t)
lemma P_ssuppl_rule:
[| E(x, t); ¬ P(x, y, t) |] ==> ∃z. P(z, x, t) ∧ ¬ O(z, y, t)
lemma ltb2:
¬ (A ∧ ¬ B) ==> ¬ A ∨ B
lemma P_ssuppl_rule_transpos:
¬ (∃z. P(z, x, t) ∧ ¬ O(z, y, t)) ==> ¬ E(x, t) ∨ P(x, y, t)
theorem P_refl:
E(x, t) ==> P(x, x, t)
theorem Me_refl:
E(x, t) ==> Me(x, x, t)
theorem Me_exists2:
Me(x, y, t) ==> E(x, t) ∧ E(y, t)
theorem Me_sym:
Me(x, y, t) ==> Me(y, x, t)
theorem Me_trans:
[| Me(x, y, t); Me(y, z, t) |] ==> Me(x, z, t)
theorem O_refl:
∀x t. E(x, t) --> O(x, x, t)
lemma O_refl_rule:
E(x, t) ==> O(x, x, t)
theorem O_sym:
∀x y t. O(x, y, t) --> O(y, x, t)
lemma O_sym_rule:
O(x, y, t) ==> O(y, x, t)
theorem O_imp_E_and_E:
O(x, y, t) ==> E(x, t) ∧ E(y, t)
theorem PP_imp_P:
∀x y t. PP(x, y, t) --> P(x, y, t)
lemma PP_imp_P_rule:
PP(x, y, t) ==> P(x, y, t)
theorem P_imp_Me_or_PP:
P(x, y, t) ==> Me(x, y, t) ∨ PP(x, y, t)
theorem PP_or_Me_imp_P:
PP(x, y, t) ∨ Me(x, y, t) ==> P(x, y, t)
theorem PP_asym:
∀x y t. PP(x, y, t) --> ¬ PP(y, x, t)
lemma PP_asym_rule:
PP(x, y, t) ==> ¬ PP(y, x, t)
theorem PP_trans:
∀x y z t. PP(x, y, t) ∧ PP(y, z, t) --> PP(x, z, t)
lemma PP_trans_rule:
[| PP(x, y, t); PP(y, z, t) |] ==> PP(x, z, t)
theorem P_and_PP_imp_PP:
[| P(x, y, t); PP(y, z, t) |] ==> PP(x, z, t)
theorem PP_and_P_imp_PP:
[| PP(x, y, t); P(y, z, t) |] ==> PP(x, z, t)
theorem P_and_notMe_imp_PP:
[| P(x, y, t); ¬ Me(x, y, t) |] ==> PP(x, y, t)
theorem P_imp_O:
P(x, y, t) ==> O(x, y, t)
theorem P_and_O:
[| P(x, y, t); O(x, z, t) |] ==> O(y, z, t)
theorem O_imp_O_imp_P:
∀x y t. E(x, t) ∧ (∀z. O(z, x, t) --> O(z, y, t)) --> P(x, y, t)
lemma O_imp_O_imp_P_rule:
[| E(x, t); ∀z. O(z, x, t) --> O(z, y, t) |] ==> P(x, y, t)
lemma ltb1:
∀z. A(z, x, t) ∧ B(z, y, t) ==> (∀z. A(z, x, t)) ∧ (∀z. B(z, y, t))
theorem O_iff_O_iff_Me:
∀x y t. E(x, t) ∧ E(y, t) ∧ (∀z. O(z, x, t) <-> O(z, y, t)) <-> Me(x, y, t)
theorem P_iff_P_iff_Me:
∀x y t. E(x, t) ∧ E(y, t) ∧ (∀z. P(z, x, t) <-> P(z, y, t)) <-> Me(x, y, t)
theorem pP_refl:
∀x. pP(x, x)
theorem pP_trans:
[| pP(x, y); pP(y, z) |] ==> pP(x, z)
theorem pPP_asym:
pPP(x, y) ==> ¬ pPP(y, x)
theorem pPP_trans:
[| pPP(x, y); pPP(y, z) |] ==> pPP(x, z)
theorem pPP_imp_pP_and_notpP:
pPP(x, y) ==> pP(x, y) ∧ ¬ pP(y, x)
theorem pO_refl:
∀x. pO(x, x)
theorem pO_sym:
pO(x, y) ==> pO(y, x)
theorem SharedpP_imp_pO:
∃z. pP(z, x) ∧ pP(z, y) ==> pO(x, y)
theorem cP_refl:
∀x. cP(x, x)
theorem cP_trans:
[| cP(x, y); cP(y, z) |] ==> cP(x, z)
theorem bP_refl:
∀x. bP(x, x)
theorem bP_trans:
[| bP(x, y); bP(y, z) |] ==> bP(x, z)
theorem pP_imp_cP_and_bP:
pP(x, y) ==> cP(x, y) ∧ bP(x, y)
theorem cP_and_bP_imp_pP:
[| cP(x, y); bP(x, y) |] ==> pP(x, y)