410 likes | 544 Views
Module 10. Recursive and r.e. language classes representing solvable and half-solvable problems Proofs of closure properties for the set of recursive (solvable) languages for the set of r.e. (half-solvable) languages Generic Element proof technique. RE and REC language classes. REC
E N D
Module 10 • Recursive and r.e. language classes • representing solvable and half-solvable problems • Proofs of closure properties • for the set of recursive (solvable) languages • for the set of r.e. (half-solvable) languages • Generic Element proof technique
RE and REC language classes • REC • A solvable language is commonly referred to as a recursive language for historical reasons • REC is defined to be the set of solvable or recursive languages • RE • A half-solvable language is commonly referred to as a recursively enumerable or r.e. language • RE is defined to be the set of r.e. or half-solvable languages
Closure Properties of REC * • We now prove REC is closed under two set operations • Set Complement • Set Intersection • In these proofs, we try to highlight intuition and common sense
ODD REC and Set Complement • Even: set of even length strings • Is Even solvable (recursive)? • Give a program P that solves it. • Complement of Even? • Odd: set of odd length strings • Is Odd recursive (solvable)? • Does this prove REC is closed under set complement? • How is the program P’ that solves Odd related to the program P that solves Even? REC EVEN All Languages
P’ No/Yes P’ Illustration P Yes/No Input x
Code for P’ bool main(string y) { if (P(y)) return no; else return yes; } bool P(string y) /* details deleted; key fact is P is guaranteed to halt on all inputs */
Set Complement Lemma • If L is a solvable language, then L complement is a solvable language • Proof • Let L be an arbitrary solvable language • First line comes from For all L in REC • Let P be the C++ program which solves L • P exists by definition of REC
proof continued • Modify P to form P’ as follows • Identical except at very end • Complement answer • Yes → No • No → Yes • Program P’ solves L complement • Halts on all inputs • Answers correctly • Thus L complement is solvable • Definition of solvable
L1 L2 REC Closed Under Set Union • If L1 and L2 are solvable languages, then L1 U L2 is a solvable language • Proof • Let L1 and L2 be arbitrary solvable languages • Let P1 and P2 be programs which solve L1 and L2, respectively L1 U L2 REC All Languages
L1 L2 REC Closed Under Set Union • Construct program P3 from P1 and P2 as follows • P3 solves L1 U L2 • Halts on all inputs • Answers correctly • L1 U L2 is solvable L1 U L2 REC All Languages
Yes/No P3 OR P3 Illustration Yes/No P1 Yes/No P2
Code for P3 bool main(string y) { if (P1(y)) return yes; else if (P2(y)) return yes; else return no; } bool P1(string y) /* details deleted; key fact is P1 always halts. */ bool P2(string y) /* details deleted; key fact is P2 always halts. */
Other Closure Properties • Unary Operations • Language Reversal • Kleene Star • Binary Operations • Set Intersection • Set Difference • Symmetric Difference • Concatenation
Closure Properties of RE * • We now try to prove RE is closed under the same two set operations • Set Union • Set Complement • In these proofs • We define a more formal proof methodology • We gain more intuition about the differences between solvable and half-solvable problems
RE Closed Under Set Union • Expressing this closure property as an infinite set of facts • Let Li denote the ith r.e. language • L1 intersect L1 is in RE • L1 intersect L2 is in RE • ... • L2 intersect L1 is in RE • ...
Generic Element or Template Proofs • Since there are an infinite number of facts to prove, we cannot prove them all individually • Instead, we create a single proof that proves each fact simultaneously • I like to call these proofs generic element or template proofs
Basic Proof Ideas • Name your generic objects • For example, L or L1 or L2 • Only use facts which apply to any relevant objects • For example, there must exist a program P1 that half-solves L1 • Work from both ends of the proof • The first and last lines are often obvious, and we can often work our way in
L1 L1 U L2 L2 RE Closed Under Set Union • Let L1 and L2 be arbitrary r.e. languages • There exist P1 and P2 s.t. Y(P1)=L1 and Y(P2)=L2 • Construct program P3 from P1 and P2 • Prove Program P3 half-solves L1 U L2 • There exists a program P that half-solves L1 U L2 • L1 U L2 is an r.e. language
L1 L1 U L2 L2 Constructing Program P3 • What code did we use for P3 when we worked with solvable languages? bool main(string y) { if (P1(y)) return yes; else if (P2(y)) return yes; else return no;} bool P1(string y) /* details deleted; key fact is P1 always halts. */ bool P2(string y) /* details deleted; key fact is P2 always halts. */ • Will this code work for half-solvable languages?
Proving P3 Is Correct • 2 steps to showing P3 half-solves L1 U L2 • For all x in L1 U L2, must show P3 • For all x not in L1 U L2, must show P3
bool main(string y) { if (P1(y)) return yes; else if (P2(y)) return yes; else return no; } P3 works correctly? • Let x be an arbitrary string in L1 U L2 • Note, this subproof is a generic element proof • What are the two possibilities for x? • x is in L1 • x is in L2 • What does P3 do if x is in L1? • Does it matter if x is in or not in L2? • What does P3 do if x is in L2? • Does it matter if x is in or not in L1? • Does P3 work correctly on such x? • If not, what strings cause P3 a problem?
bool main(string y) { if (P1(y)) return yes; else if (P2(y)) return yes; else return no; } P3 works correctly? • Let x be an arbitrary string NOT in L1 U L2 • Note, this subproof is a generic element proof • x is not in L1 AND x is not in L2 • What does P3 do on x in this case? • What does P1 do on x? • What does P2 do on x? • Does P3 work correctly on such x?
Code for Correct P3 bool main(string y){ if ((P1(y) || P2(y)) return yes; /* P1 and P2 run in parallel (alternating execution) */ else return no; } bool P1(string y) /* key fact is P1 only guaranteed to halt on yes input instances */ bool P2(string y) /* key fact is P2 only guaranteed to halt on yes input instances */
bool main(string y){ if ((P1(y) || P2(y)) return yes; else return no; } /* P1 and P2 run in parallel */ P3 works correctly? • Let x be an arbitrary string in L1 U L2 • Note, this subproof is a generic element proof • What are the two possibilities for x? • x is in L1 • x is in L2 • What does P3 do if x is in L1? • Does it matter if x is in or not in L2? • What does P3 do if x is in L2? • Does it matter if x is in or not in L1? • Does P3 work correctly on such x? • If not, what strings cause P3 a problem?
RE L Lc RE and Set complement • First-order logic formulation for statement • RE is closed under set complement • What this really means • Let Li denote the ith r.e. language • L1 complement is in RE • L2 complement is in RE • ...
RE L Lc RE and Set complement • Let L be an arbitrary r.e. language • There exists P s.t. Y(P)=L • Construct program P’ from P • Prove Program P’ half-solves L complement • There exists a program P’ which half-solves L complement • L complement is an r.e. language
Constructing P’ • What did we do in recursive case? • Run P and then just complement answer at end • Accept → Reject • Reject → Accept • Does this work in this case? • No. Why not? • Does this prove that RE is not closed under set complement?
Other closure properties • Unary Operations • Language reversal • Kleene Closure • Binary operations • set intersection • concatenation • Not closed • Set difference (on practice hw)
Pseudo Closure Property • Lemma: If L and Lc are half-solvable, then L is solvable. • Question: What about Lc?
High Level Proof • Let L be an arbitrary language where L and Lc are both half-solvable • Let P1 and P2 be the programs which half-solve L and Lc, respectively • Construct program P3 from P1 and P2 • Argue P3 solves L • L is solvable
Constructing P3 • Problem • Both P1 and P2 may loop on some input strings, and we need P3 to halt on all input strings • Key Observation • On all input strings, one of P1 and P2 is guaranteed to halt. Why?
L Lc P1 halts P2 halts Illustration S*
Construction and Proof • P3’s Operation • Run P1 and P2 in parallel on the input string x until one accepts x • Guaranteed to occur given previous argument • Also, only one program will accept any string x • IF P1 is the accepting machine THEN yes ELSE no
Yes Input P3 No P3 Illustration Yes P1 Yes P2
Code for P3 * bool main(string y) { parallel-execute(P1(y), P2(y)) until one returns yes; if (P1(y)) return yes; if (P2(Y)) return no; } bool P1(string y) /* guaranteed to halt on strings in L*/ bool P2(string y) /* guaranteed to halt on strings in Lc */
REC L Lc RE and REC All Languages RE
REC L Lc Lc Lc RE and REC All Languages RE Are there any languages L in RE - REC?
REC H Hc RE and REC All Languages RE So where does Hc belong?
Closure Property Questions • Which of the following imply L is solvable given REC is closed under set union? • L1 U L2 = L • L1 U L = L2 • L U L2 = L1 • In all cases, L1 and L2 are known to be solvable
Closure Property Questions • Which of the following imply L is NOT solvable given REC is closed under set union? • L1 U L2 = L • L1 U L = L2 • L U L2 = L1 • In all cases, L1 is solvable and L2 is NOT solvable
Summary • Definition of REC and RE • Proofs of some closure properties for both language classes • RE more complex • Pseudo-closure Property • RE is not closed under set complement • Proving a language is or is not in a language class using closure properties