Deterministic Boolean-oracle Turing machines -- proof internals #
theorem
Complexity.OracleTM.stepRel_functional_internal
{n : ℕ}
{machine : OracleTM n}
{oracle : BooleanOracle}
{cfg first second : OracleCfg n machine.Q}
(hfirst : machine.stepRel oracle cfg first)
(hsecond : machine.stepRel oracle cfg second)
:
theorem
Complexity.OracleTM.reachesIn_map_internal
{n : ℕ}
{machine : OracleTM n}
{oracle : BooleanOracle}
{workTapes : ℕ}
{target : TM workTapes}
(mapCfg : OracleCfg n machine.Q → Cfg workTapes target.Q)
(hstep :
∀ {cfg next : OracleCfg n machine.Q},
machine.step oracle cfg = some next → target.step (mapCfg cfg) = some (mapCfg next))
{time : ℕ}
{start result : OracleCfg n machine.Q}
(hreach : machine.reachesIn oracle time start result)
:
target.reachesIn time (mapCfg start) (mapCfg result)
theorem
Complexity.OracleTM.step_query_true_internal
{n : ℕ}
{machine : OracleTM n}
{oracle : BooleanOracle}
{cfg : OracleCfg n machine.Q}
{yesState noState : machine.Q}
(hhalt : cfg.state ≠ machine.qhalt)
(hquery : machine.queryTransition cfg.state = some (yesState, noState))
(hanswer : oracle cfg.query.oracleQuery = true)
:
theorem
Complexity.OracleTM.step_query_false_internal
{n : ℕ}
{machine : OracleTM n}
{oracle : BooleanOracle}
{cfg : OracleCfg n machine.Q}
{yesState noState : machine.Q}
(hhalt : cfg.state ≠ machine.qhalt)
(hquery : machine.queryTransition cfg.state = some (yesState, noState))
(hanswer : oracle cfg.query.oracleQuery = false)
:
theorem
Complexity.OracleTM.reachesIn_one_query_true_internal
{n : ℕ}
{machine : OracleTM n}
{oracle : BooleanOracle}
{cfg : OracleCfg n machine.Q}
{yesState noState : machine.Q}
(hhalt : cfg.state ≠ machine.qhalt)
(hquery : machine.queryTransition cfg.state = some (yesState, noState))
(hanswer : oracle cfg.query.oracleQuery = true)
:
theorem
Complexity.OracleTM.reachesIn_one_query_false_internal
{n : ℕ}
{machine : OracleTM n}
{oracle : BooleanOracle}
{cfg : OracleCfg n machine.Q}
{yesState noState : machine.Q}
(hhalt : cfg.state ≠ machine.qhalt)
(hquery : machine.queryTransition cfg.state = some (yesState, noState))
(hanswer : oracle cfg.query.oracleQuery = false)
:
theorem
Complexity.TM.toOracleTM_queryTransition_internal
{n : ℕ}
(machine : TM n)
(state : machine.Q)
:
theorem
Complexity.TM.toOracleTM_step_oracle_independent_internal
{n : ℕ}
(machine : TM n)
(first second : BooleanOracle)
(cfg : OracleCfg n machine.Q)
:
theorem
Complexity.TM.erase_toOracleTM_step_internal
{n : ℕ}
(machine : TM n)
(oracle : BooleanOracle)
(cfg : OracleCfg n machine.Q)
:
theorem
Complexity.TM.erase_toOracleTM_reachesIn_internal
{n : ℕ}
(machine : TM n)
(oracle : BooleanOracle)
{time : ℕ}
{start result : OracleCfg n machine.Q}
(hreach : machine.toOracleTM.reachesIn oracle time start result)
:
theorem
Complexity.TM.exists_toOracleTM_step_of_step_erase_internal
{n : ℕ}
(machine : TM n)
(oracle : BooleanOracle)
{cfg : OracleCfg n machine.Q}
{next : Cfg n machine.Q}
(hstep : machine.step cfg.erase = some next)
:
∃ (oracleNext : OracleCfg n machine.toOracleTM.Q),
machine.toOracleTM.step oracle cfg = some oracleNext ∧ oracleNext.erase = next
theorem
Complexity.TM.exists_toOracleTM_reachesIn_of_reachesIn_erase_internal
{n : ℕ}
(machine : TM n)
(oracle : BooleanOracle)
{time : ℕ}
(start : OracleCfg n machine.Q)
{result : Cfg n machine.Q}
(hreach : machine.reachesIn time start.erase result)
:
∃ (oracleResult : OracleCfg n machine.toOracleTM.Q),
machine.toOracleTM.reachesIn oracle time start oracleResult ∧ oracleResult.erase = result
theorem
Complexity.TM.toOracleTM_decidesInTime_iff_internal
{n : ℕ}
(machine : TM n)
(oracle : BooleanOracle)
(language : Language)
(timeBound : ℕ → ℕ)
:
machine.toOracleTM.DecidesInTime oracle language timeBound ↔ machine.DecidesInTime language timeBound