Skip to content
Browse chapters
Imports

Fixed syntax checks for SUBSET-SUM instances and mask certificates

The instance grammar contains at least the target field. A mask certificate contains zero or more raw Boolean symbols. Both checks are implemented by the same finite state space and emit one Boolean.

noncomputable sectionnamespace CLRS.Chapter34.Turing.SubsetSumVerifier.Syntaxopen PolyBuilderinductive Mode | instanceStart | instanceNeedField | instanceBetween | fieldEmpty | fieldSingleZero | fieldPositive | maskStart | maskBody | ended | invalid deriving DecidableEq, Fintypedef nextMode : Mode → SubsetSumSym → Mode | .instanceStart, .instanceMark => .instanceNeedField | .instanceNeedField, .numberMark => .fieldEmpty | .instanceBetween, .numberMark => .fieldEmpty | .instanceBetween, .recordEnd => .ended | .fieldEmpty, .bit false => .fieldSingleZero | .fieldEmpty, .bit true => .fieldPositive | .fieldSingleZero, .fieldEnd => .instanceBetween | .fieldPositive, .bit _ => .fieldPositive | .fieldPositive, .fieldEnd => .instanceBetween | .maskStart, .certificateMark => .maskBody | .maskBody, .bit _ => .maskBody | .maskBody, .recordEnd => .ended | _, _ => .invaliddef modeAccepts : Mode → Bool | .ended => true | _ => falsedef spec (initial : Mode) : StatefulFlatMapSpec Mode SubsetSumSym Bool where initial := initial action mode symbol := ([], nextMode mode symbol) finish mode := [modeAccepts mode]def finalMode (mode : Mode) (input : List SubsetSumSym) : Mode := input.foldl nextMode mode private theorem rewriteFrom_eq (initial mode : Mode) (input : List SubsetSumSym) : rewriteStatefulFlatMapFrom (spec initial) mode input = [modeAccepts (finalMode mode input)] := by induction input generalizing mode with | nil => rfl | cons symbol rest ih => rw [rewriteStatefulFlatMapFrom.eq_def] simpa [spec, finalMode] using ih (nextMode mode symbol)def instanceSyntax (input : List SubsetSumSym) : Bool := (rewriteStatefulFlatMap (spec .instanceStart) input).headD falsedef maskSyntax (input : List SubsetSumSym) : Bool := (rewriteStatefulFlatMap (spec .maskStart) input).headD false theorem instanceSyntax_eq (input : List SubsetSumSym) : instanceSyntax input = modeAccepts (finalMode .instanceStart input) := by unfold instanceSyntax rewriteStatefulFlatMap rw [rewriteFrom_eq] rfl theorem maskSyntax_eq (input : List SubsetSumSym) : maskSyntax input = modeAccepts (finalMode .maskStart input) := by unfold maskSyntax rewriteStatefulFlatMap rw [rewriteFrom_eq] rfl private theorem rewrite_instance_eq (input : List SubsetSumSym) : rewriteStatefulFlatMap (spec .instanceStart) input = [instanceSyntax input] := by unfold instanceSyntax rewriteStatefulFlatMap rw [rewriteFrom_eq] rfl private theorem rewrite_mask_eq (input : List SubsetSumSym) : rewriteStatefulFlatMap (spec .maskStart) input = [maskSyntax input] := by unfold maskSyntax rewriteStatefulFlatMap rw [rewriteFrom_eq] rfl noncomputable def instanceComputableInPolyTime : _root_.Turing.TM2ComputableInPolyTime id _root_.Turing.TM2Comp.boolEncoding instanceSyntax := by have machine := statefulFlatMap_computableInPolyTime (spec .instanceStart) exact { tm := machine.tm inputAlphabet := machine.inputAlphabet outputAlphabet := machine.outputAlphabet time := machine.time outputsFun := fun input => by have output := machine.outputsFun input rw [rewrite_instance_eq] at output exact output } noncomputable def maskComputableInPolyTime : _root_.Turing.TM2ComputableInPolyTime id _root_.Turing.TM2Comp.boolEncoding maskSyntax := by have machine := statefulFlatMap_computableInPolyTime (spec .maskStart) exact { tm := machine.tm inputAlphabet := machine.inputAlphabet outputAlphabet := machine.outputAlphabet time := machine.time outputsFun := fun input => by have output := machine.outputsFun input rw [rewrite_mask_eq] at output exact output }end CLRS.Chapter34.Turing.SubsetSumVerifier.Syntax