Module 1: Course Overview • Course: CSE 460 • Instructor: Dr. Eric Torng • Grader/TA: To be determined 1 What is this course? • Philosophy of computing course – We take a step back to think about computing in broader terms • Science of computing course – We study fundamental ideas/results that shape the field of computer science • “Applied” computing course – We learn study a broad range of material with relevance to computing today 2 Philosophy • Phil. of life – What is the purpose of life? – What are we capable of accomplishing in life? – Are there limits to what we can do in life? – Why do we drive on parkways and park on driveways? • Phil. of computing – What is the purpose of programming? – What can we achieve through programming? – Are there limits to what we can do with programs? – Why don’t debuggers actually debug programs? 3 Science • Physics – Study of fundamental physical laws and phenomenon like gravity and electricity • Engineering – Governed by physical laws • Our material – Study of fundamental computational laws and phenomenon like undecidability and universal computers • Programming – Governed by computational laws 4 Applied computing • Applications are not immediately obvious – In some cases, seeing the applicability of this material requires advanced abstraction skills • Every year, there are people who leave this course unable to see the applicability of the material – Others require more material in order to completely understand their application • for example, to understand how regular expressions and context-free grammars are applied to the design of compilers, you need to take a compilers course 5 Some applications – Important programming languages • regular expressions (perl) • finite state automata (used in hardware design) • context-free grammars – Proofs of program correctness – Subroutines • Using them to prove problems are unsolvable – String searching/Pattern matching – Algorithm design concepts such as recursion 6 Fundamental Theme * • What are the capabilities and limitations of computers and computer programs? – What can we do with computers/programs? – Are there things we cannot do with computers/programs? 7 Module 2: Fundamental Concepts • Problems • Programs – Programming languages 8 Problems We view solving problems as the main application for computer programs 9 Definition • A problem is a mapping or function between a set of inputs and a set of outputs • Example Problem: Sorting (4,2,3,1) (3,1,2,4) (7,5,1) (1,2,3) Inputs (1,2,3,4) (1,5,7) (1,2,3) Outputs 10 How to specify a problem • Input – Describe what an input instance looks like • Output – Describe what task should be performed on the input – In particular, describe what output should be produced 11 Example Problem Specifications* – Sorting problem • Input – Integers n1, n2, ..., nk • Output – n1, n2, ..., nk in nondecreasing order – Find element problem • Input – Integers n1, n2, …, nk – Search key S • Output – yes if S is in n1, n2, …, nk, no otherwise 12 Programs Programs solve problems 13 Purpose • Why do we write programs? • One answer – To solve problems – What does it mean to solve a problem? • Informal answer: For every legal input, a correct output is produced. • Formal answer: To be given later 14 Programming Language • Definition – A programming language defines what constitutes a legal program – Example: a pseudocode program may not be a legal C++ program which may not be a legal C program – A programming language is typically referred to as a “computational model” in a course like this. 15 C++ • Our programming language will be C++ with minor modifications – Main procedure will use input parameters in a fashion similar to other procedures • no argc/argv – Output will be returned • type specified by main function type 16 Maximum Element Problem • Input – integer n ≥ 1 – List of n integers • Output – The largest of the n integers 17 C++ Program which solves the Maximum Element Problem* int main(int A[], int n) { int i, max; if (n < 1) return (“Illegal Input”); max = A[0]; for (i = 1; i < n; i++) if (A[i] > max) max = A[i]; return (max); } 18 Fundamental Theme Exploring capabilities and limitations of C++ programs 19 Restating the Fundamental Theme * • We will study the capabilities and limits of C++ programs • Specifically, we will try and identify – What problems can be solved by C++ programs – What problems cannot be solved by C++ programs 20 Question • Is C++ general enough? • Or is it possible that there exists some problem P such that – P can be solved by some program P in some other reasonable programming language – but P cannot be solved by any C++ program? 21 Church’s Thesis (modified) • We have no proof of an answer, but it is commonly accepted that the answer is no. • Church’s Thesis (three identical statements) – C++ is a general model of computation – Any algorithm can be expressed as a C++ program – If some algorithm cannot be expressed by a C++ program, it cannot be expressed in any reasonable programming language 22 Summary * • Problems – When we talk about what programs can or cannot “DO”, we mean what PROBLEMS can or cannot be solved 23 Module 3: Classifying Problems • One of the main themes of this course will be to classify problems in various ways – By solvability • Solvable, “half-solvable”, unsolvable • We will focus our study on decision problems – function (one correct answer for every input) – finite range (yes or no is the correct output) 24 Classification Process • Take some set of problems and partition it into two or more subsets of problems where membership in a subset is based on some shared problem characteristic Subset 1 Set of Problems Subset 2 Subset 3 25 Classify by Solvability • Criteria used is whether or not the problem is solvable – that is, does there exist a C++ program which solves the problem? Set of All Problems Solvable Problems Unsolvable Problems 26 Function Problems • We will focus on problems where the mapping from input to output is a function Set of All Problems Non-Function Problems Function Problems 27 General (Relation) Problem • the mapping is a relation – that is, more than one output is possible for a given input Inputs Outputs 28 Criteria for Function Problems • mapping is a function – unique output for each input Inputs Outputs 29 Example Non-Function Problem • Divisor Problem – Input: Positive integer n – Output: A positive integral divisor of n 9 Inputs 1 3 9 Outputs 30 Example Function Problems • Sorting • Multiplication Problem – Input: 2 integers x and y – Output: xy 2,5 Inputs 10 Outputs 31 Another Example * • Maximum divisor problem – Input: Positive integer n – Output: size of maximum divisor of n smaller than n 9 Inputs 1 3 9 Outputs 32 Decision Problems • We will focus on function problems where the correct answer is always yes or no Set of Function Problems Non-Decision Problems Decision Problems 33 Criteria for Decision Problems • Output is yes or no – range = {Yes, No} • Note, problem must be a function problem – only one of Yes/No is correct Yes No Inputs Outputs 34 Example • Decision sorting – Input: list of integers – Yes/No question: Is the list in nondecreasing order? (1,3,2,4) (1,2,3,4) Inputs Yes No Outputs 35 Another Example • Decision multiplication – Input: Three integers x, y, z – Yes/No question: Is xy = z? (3,5,14) (3,5,15) Inputs Yes No Outputs 36 A Third Example * • Decision Divisor Problem – Input: Two integers x and y – Yes/No question: Is y a divisor of x? (14,5) (14,7) Inputs Yes No Outputs 37 Focus on Decision Problems Set of All Problems Solvable Problems Unsolvable Problems Other Probs Decision Problems • When studying solvability, we are going to focus specifically on decision problems – There is no loss of generality, but we will not explore that here 38 Finite Domain Problems • These problems have only a finite number of inputs Set of All Problems Finite Domain Problems Infinite Domain Problems 39 Lack of Generality Set of All Problems Solvable Problems Unsolvable Problems Infinite Domain Finite Domain Empty • All finite domain problems can be solved using “table lookup” idea 40 Table Lookup Program int main(string x) { switch x { case “Bill”: return(3); case “Judy”: return(25); case “Tom”: return(30); default: cerr << “Illegal input\n”; } 41 Key Concepts • Classification Theme • Decision Problems – Important subset of problems – We can focus our attention on decision problems without loss of generality – Same is not true for finite domain problems • Table lookup 42 Module 4: Formal Definition of Solvability • Analysis of decision problems – Two types of inputs:yes inputs and no inputs – Language recognition problem • Analysis of programs which solve decision problems – Four types of inputs: yes, no, crash, loop inputs – Solving and not solving decision problems • Classifying Decision Problems – Formal definition of solvable and unsolvable decision problems 43 Analyzing Decision Problems Can be defined by two sets 44 Decision Problems and Sets • Decision problems consist of 3 sets – The set of legal input instances (or universe of input instances) – The set of “yes” input instances – The set of “no” input instances Set of All Legal Inputs Yes Inputs No Inputs 45 Redundancy * • Only two of these sets are needed; the third is redundant – Given • The set of legal input instances (or universe of input instances) – This is given by the description of a typical input instance • The set of “yes” input instances – This is given by the yes/no question – We can compute • The set of “no” input instances 46 Typical Input Universes • S*: The set of all finite length strings over finite alphabet S – Examples • {a}*: {/\, a, aa, aaa, aaaa, aaaaa, … } • {a,b}*: {/\, a, b, aa, ab, ba, bb, aaa, aab, aba, abb, … } • {0,1}*: {/\, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, … } • The set of all integers • If the input universe is understood, a decision problem can be specified by just giving the set of yes input instances 47 Language Recognition Problem • Input Universe – S* for some finite alphabet S • Yes input instances – Some set L subset of S* • No input instances – S* - L • When S is understood, a language recognition problem can be specified by just stating what L is. 48 Language Recognition Problem * • Traditional Formulation – Input • A string x over some finite alphabet S – Task • Is x in some language L subset of S*? • 3 set formulation • Input Universe – S* for a finite alphabet S • Yes input instances – Some set L subset of S* • No input instances – S* - L • When S is understood, a language recognition problem can be specified by just stating what L is. 49 Equivalence of Decision Problems and Languages • All decision problems can be formulated as language recognition problems – Simply develop an encoding scheme for representing all inputs of the decision problem as strings over some fixed alphabet S – The corresponding language is just the set of strings encoding yes input instances • In what follows, we will often use decision problems and languages interchangeably 50 Visualization * Yes Inputs Language L Encoding Scheme over alphabet S No Inputs Original Decision Problem S* - L Corresponding Language Recognition Problem 51 Analyzing Programs which Solve Decision Problems Four possible outcomes 52 Program Declaration • Suppose a program P is designed to solve some decision problem P. What does P’s declaration look like? • What should P return on a yes input instance? • What should P return on a no input instance? 53 Program Declaration II • Suppose a program P is designed to solve a language recognition problem P. What does P’s declaration look like? – bool main(string x) { • We will assume that the string declaration is correctly defined for the input alphabet S – If S = {a,b}, then string will define variables consisting of only a’s and b’s – If S = {a, b, …, z, A, …, Z}, then string will define variables consisting of any string of alphabet characters 54 Programs and Inputs • Notation – P denotes a program – x denotes an input for program P • 4 possible outcomes of running P on x – P halts and says yes: P accepts input x – P halts and says no: P rejects input x – P halts without saying yes or no: P crashes on input x • We typically ignore this case as it can be combined with rejects – P never halts: P infinite loops on input x 55 Programs and the Set of Legal Inputs • Based on the 4 possible outcomes of running P on x, P partitions the set of legal inputs into 4 groups – Y(P): The set of inputs P accepts • When the problem is a language recognition problem, Y(P) is often represented as L(P) – N(P): The set of inputs P rejects – C(P): The set of inputs P crashes on – I(P): The set of inputs P infinite loops on • Because L(P) is often used in place of Y(P) as described above, we use notation I(P) to represent this set 56 Illustration All Inputs Y(P) N(P) C(P) I(P) 57 Analyzing Programs and Decision Problems Distinguish the two carefully 58 Program solving a decision problem Y(P) N(P) C(P) I(P) • Formal Definition: – A program P solves decision problem P if and only if • The set of legal inputs for P is identical to the set of input instances of P • Y(P) is the same as the set of yes input instances for P • N(P) is the same as the set of no input instances for P – Otherwise, program P does not solve problem P • Note C(P) and I(P) must be empty in order for P to solve problem P 59 Solvable Problem • A decision problem P is solvable if and only if there exists some C++ program P which solves P – When the decision problem is a language recognition problem for language L, we often say that L is solvable or L is decidable • A decision problem P is unsolvable if and only if all C++ programs P do not solve P – Similar comment as above 60 Illustration of Solvability Inputs of Program P Y(P) N(P) Yes Inputs No Inputs C(P) I(P) Inputs of Problem P 61 Program halfsolving a problem Y(P) N(P) C(P) I(P) • Formal Definition: – A program P half-solves problem P if and only if • The set of legal inputs for P is identical to the set of input instances of P • Y(P) is the same as the set of yes input instances for P • N(P) union C(P) union I(P) is the same as the set of no input instances for P – Otherwise, program P does not half-solve problem P • Note C(P) and I(P) need not be empty 62 Half-solvable Problem • A decision problem P is half-solvable if and only if there exists some C++ program P which half-solves P – When the decision problem is a language recognition problem for language L, we often say that L is half-solvable • A decision problem P is not half-solvable if and only if all C++ programs P do not halfsolve P 63 Illustration of Half-Solvability * Inputs of Program P Y(P) Yes Inputs N(P) C(P) I(P) No Inputs Inputs of Problem P 64 Hierarchy of Decision Problems All decision problems Half-solvable Solvable The set of half-solvable decision problems is a proper subset of the set of all decision problems The set of solvable decision problems is a proper subset of the set of half-solvable decision problems. 65 Why study half-solvable problems? • A correct program must halt on all inputs • Why then do we define and study half-solvable problems? • One Answer: the set of half-solvable problems is the natural class of problems associated with general computational models like C++ – Every program half-solves some decision problem – Some programs do not solve any decision problem • In particular, programs which do not halt do not solve their corresponding decision problems 66 Key Concepts • Four possible outcomes of running a program on an input • The four subsets every program divides its set of legal inputs into • Formal definition of – a program solving (half-solving) a decision problem – a problem being solvable (half-solvable) • Be precise: with the above two statements! 67 Module 5 • Topics – Proof of the existence of unsolvable problems • Proof Technique – There are more problems/languages than there are programs/algorithms – Countable and uncountable infinities 68 Overview • We will show that there are more problems than programs – Actually more problems than programs in any computational model (programming language) • Implication – Some problems are not solvable 69 Preliminaries Define set of problems Observation about programs 70 Define set of problems • We will restrict the set of problems to be the set of language recognition problems over the alphabet {a}. • That is – Universe: {a}* – Yes Inputs: Some language L subset of {a}* – No Inputs: {a}* - L 71 Set of Problems * • The number of distinct problems is given by the number of languages L subset of {a}* – 2{a}* is our shorthand for this set of subset languages • Examples of languages L subset of {a}* – – – – 0 elements: { } 1 element: {/\}, {a}, {aa}, {aaa}, {aaaa}, … 2 elements: {/\, a}, {/\, aa}, {a, aa}, … Infinite # of elements: {an | n is even}, {an | n is prime}, {an | n is a perfect square} 72 Infinity and {a}* • All strings in {a}* have finite length • The number of strings in {a}* is infinite • The number of languages L in 2{a}* is infinite • The number of strings in a language L in 2{a}* may be finite or infinite 73 Define set of programs • The set of programs we will consider are the set of legal C++ programs as defined in earlier lectures • Key Observation – Each C++ program can be thought of as a finite length string over alphabet SP • SP = {a, …, z, A, …, Z, 0, …, 9, white space, punctuation} 74 Example * int main(int A[], int n){ int i, max; {26 characters including newline} {13 characters including initial tab} {1 character: newline} if (n < 1) return (“Illegal Input”); max = A[0]; for (i = 1; i < n; i++) if (A[i] > max) max = A[i]; return (max); } {12 characters} {28 characters including 2 tabs} {13 characters} {25 characters} {18 characters} {15 characters} {15 characters} {2 characters including newline} 75 Number of programs • The set of legal C++ programs is clearly infinite • It is also no more than |SP*| – SP = {a, …, z, A, …, Z, 0, …, 9, white space, punctuation} 76 Goal • Show that the number of languages L in 2{a}* is greater than the number of strings in SP* – SP = {a, …, z, A, …, Z, 0, …, 9, white space, punctuation} • Problem – Both are infinite 77 How do we compare the relative sizes of infinite sets? Bijection (yes) Proper subset (no) 78 Bijections • Two sets have EQUAL size if there exists a bijection between them – bijection is a 1-1 and onto function between two sets • Examples – Set {1, 2, 3} and Set {A, B, C} – Positive even numbers and positive integers 79 Bijection Example • Positive Integers Positive Even Integers 1 2 3 ... i … 2 4 6 ... 2i ... 80 Proper subset • Finite sets – S1 proper subset of S2 implies S2 is strictly bigger than S1 • Example – women proper subset of people – number of women less than number of people • Infinite sets – Counterexample • even numbers and integers 81 Two sizes of infinity Countable Uncountable 82 Countably infinite set S * • Definition 1 – S is equal in size (bijection) to N • N is the set of natural numbers {1, 2, 3, …} • Definition 2 (Key property) – There exists a way to list all the elements of set S (enumerate S) such that the following is true • Every element appears at a finite position in the infinite list 83 Uncountable infinity * • Any set which is not countably infinite • Examples – Set of real numbers – 2{a}*, the set of all languages L which are a subset of {a}* • Further gradations within this set, but we ignore them 84 Proof 85 (1) The set of all legal C++ programs is countably infinite • Every C++ program is a finite string • Thus, the set of all legal C++ programs is a language LC • This language LC is a subset of SP* 86 For any alphabet S, S* is countably infinite • Enumeration ordering – All length 0 strings • |S|0 = 1 string: l – All length 1 strings • |S| strings – All length 2 strings • |S|2 strings –… • Thus, SP* is countably infinite 87 Example with alphabet {a,b} * • Length 0 strings – 0 and l • Length 1 strings – 1 and a, 2 and b • Length 2 strings – 3 and aa, 4 and ab, 5 and ba, 6 and bb, ... • Question – write a program that takes a number as input and computes the corresponding string as output 88 (2) The set of languages in 2{a}* is uncountably infinite • Diagonalization proof technique – “Algorithmic” proof – Typically presented as a proof by contradiction 89 Algorithm Overview * • To prove this set is uncountably infinite, we construct an algorithm D that behaves as follows: – Input • A countably infinite list of languages L[] subset of {a}* – Output • A language D(L[]) which is a subset of {a}* that is not on list L[] 90 Visualizing D List L[] L[0] L[1] L[2] Algorithm D Language D(L[]) not in list L[] L[3] ... 91 Why existence of D implies result • If the number of languages in 2{a}* is countably infinite, there exists a list L[] s.t. – L[] is complete • it contains every language in 2{a}* – L[] is countably infinite • The existence of algorithm D implies that no list of languages in 2{a}* is both complete and countably infinite – Specifically, the existence of D shows that any countably infinite list of languages is not complete 92 Visualizing One Possible L[ ] * L[0] L[1] L[2] L[3] L[4] l a aa aaa aaaa ... IN IN IN IN IN IN OUT IN OUT IN OUT OUT OUT OUT OUT OUT IN IN OUT OUT •#Rows is countably infinite •Given •#Cols is countably infinite • {a}* is countably infinite OUT IN OUT OUT IN ... • Consider each string to be a feature – A set contains or does not contain each string 93 Constructing D(L[ ]) * • We construct D(L[]) by using a unique feature (string) to differentiate D(L[]) from L[i] – Typically use ith string for language L[i] – Thus the name diagonalization D(L[]) l a L[0] L[1] L[2] IN IN OUT L[3] L[4] OUT IN aa aaa aaaa ... IN IN IN IN OUT IN IN OUT IN OUT OUT OUT IN OUT OUT IN OUT IN OUT OUT IN OUT OUT OUT IN ... 94 D(L[]) cannot be any language L[i] • D(L[]) cannot be language L[0] because D(L[]) differs from L[0] with respect to string a0 = /\. – If L[0] contains /\, then D(L[]) does not, and vice versa. • D(L[]) cannot be language L[1] because D(L[]) differs from L[1] with respect to string a1 = a. – If L[1] contains a, then D(L[]) does not, and vice versa. • D(L[]) cannot be language L[2] because D(L[]) differs from L[2] with respect to string a2 = aa. – If L[2] contains aa, then D(L[]) does not, and vice versa. • … 95 Questions L[0] L[1] L[2] L[3] L[4] l a aa aaa aaaa ... IN IN IN IN IN IN OUT IN OUT IN OUT OUT OUT OUT OUT OUT IN IN OUT OUT OUT IN OUT OUT IN ... • Do we need to use the diagonal? – Every other column and every row? – Every other row and every column? • What properties are needed to construct D(L[])? 96 Visualization All problems Solvable Problems The set of solvable problems is a proper subset of the set of all problems. 97 Summary • Equal size infinite sets: bijections – Countable and uncountable infinities • More languages than algorithms – Number of algorithms countably infinite – Number of languages uncountably infinite – Diagonalization technique • Construct D(L[]) using infinite set of features • The set of solvable problems is a proper subset of the set of all problems 98 Module 6 • Topics – Program behavior problems • Input of problem is a program/algorithm • Definition of type program – Program correctness • Testing versus Proving 99 Number Theory Problems • These are problems where we investigate properties of numbers – Primality • Input: Positive integer n • Yes/No Question: Is n a prime number? – Divisor • Input: Integers m,n • Yes/No question: Is m a divisor of n? 100 Graph Theory Problems • These are problems where we investigate properties of graphs – Connected • Input: Graph G • Yes/No Question: Is G a connected graph? – Subgraph • Input: Graphs G1 and G2 • Yes/No question: Is G1 a subgraph of G2? 101 Program Behavior Problems • These are problems where we investigate properties of programs and how they behave • Give an example problem with one input program P • Give an example problem with two input programs P1 and P2 102 Program Representation • Program variables – Abstractly, we define the type “program” • graph G, program P – More concretely, we define type program to be a string over the program alphabet SP = {a, …, z, A, …, Z, 0, …, 9, punctuation, white space} • Note, many strings over SP are not legal programs • We consider them to be programs that always crash • Possible declaration of main procedure – bool main(program P) 103 Program correctness • How do we determine whether or not a program P we have written is correct? • What are some weaknesses of this approach? • What might be a better approach? 104 Testing versus Analyzing Test Inputs x1 x2 x3 ... Program P Program P Analyzer Outputs P(x1) P(x2) P(x3) ... Analysis of Program P 105 2 Program Behavior Problems * • Correctness – Input • Program P – Yes/No Question • Does P correctly solve the primality problem? • Functional Equivalence – Input • Programs P1, P2 – Yes/No Question • Is program P1 functionally equivalent to program P2 106 Module 7 • Halting Problem – Fundamental program behavior problem – A specific unsolvable problem – Diagonalization technique revisited • Proof more complex 107 Definition • Input – Program P • Assume the input to program P is a single nonnegative integer – This assumption is not necessary, but it simplifies the following unsolvability proof – To see the full generality of the halting problem, remove this assumption – Nonnegative integer x, an input for program P • Yes/No Question – Does P halt when run on x? • Notation – Use H as shorthand for halting problem when space is a constraint 108 Example Input * • Program with one input of type unsigned bool main(unsigned Q) { int i=2; if ((Q = = 0) || (Q= = 1)) return false; while (i<Q) { if (Q%i = = 0) return (false); i++; } return (true); } • Input x 4 109 Three key definitions 110 Definition of list L * SP* is countably infinite where SP = {characters, digits, white space, punctuation} • Type program will be type string with SP as the alphabet • Define L to be the strings in SP* listed in enumeration order • – length 0 strings first – length 1 strings next – … • Every program is a string in SP – For simplicity, consider only programs that have • one input • the type of this input is an unsigned • Consider strings in SP* that are not legal programs to be programs that always crash (and thus halt on all inputs) 111 Definition of PH * • If H is solvable, some program must solve H • Let PH be a procedure which solves H – We declare it as a procedure because we will use PH as a subroutine • Declaration of PH – bool PH(program P, unsigned x) • In general, the type of x should be the type of the input to P • Comments – We do not know how PH works – However, if H is solvable, we can build programs which call PH as a subroutine 112 Definition of program D bool main(unsigned y) /* main for program D */ { program P = generate(y); if (PH(P,y)) while (1>0); else return (yes); } /* generate the yth string in SP* in enumeration order */ program generate(unsigned y) /* code for program of slide 21 from module 5 did this for {a,b}* */ bool PH(program P, unsigned x) /* how PH solves H is unknown */ 113 Generating Py from y * • We won’t go into this in detail here – This was the basis of the question at the bottom of slide 21 of lecture 5 (alphabet for that problem was {a,b} instead of SP). – This is the main place where our assumption about the input type for program P is important • for other input types, how to do this would vary • Specification – – – – – – – – 0 maps to program l 1 maps to program a 2 maps to program b 3 maps to program c … 26 maps to program z 27 maps to program A … 114 Proof that H is not solvable 115 Argument Overview * H is solvable Definition of Solvability PH exists H is NOT solvable PH does NOT exist D’s code D exists L is list of all programs D is on list L D does NOT exist D is NOT on list L p → q is logically equivalent to (not q) → (not p) 116 Proving D is not on list L • Use list L to specify a program behavior B that is distinct from all real program behaviors (for programs with one input of type unsigned) – Diagonalization argument similar to the one for proving the number of languages over {a} is uncountably infinite – No program P exists that exhibits program behavior B • Argue that D exhibits program behavior B – Thus D cannot exist and thus is not on list L 117 Non-existent program behavior B 118 Visualizing List L * P0 P1 P2 P3 P4 0 1 2 3 4 H H H H H H NH H NH H NH NH NH NH NH NH H H H H H NH NH H H ... •#Rows is countably infinite • Sp* is countably infinite •#Cols is countably infinite • Set of nonnegative integers is countably infinite ... • Consider each number to be a feature – A program halts or doesn’t halt on each integer – We have a fixed L this time 119 Diagonalization to specify B * •We specify a non-existent program behavior B by using a unique feature (number) to differentiate B from Pi B 0 1 2 3 4 P0 NH H H H H H H NH H H NH H P1 P2 P3 P4 ... NH NH NH H NH NH NH H H H H H NH H NH H NH H ... 120 Arguing D exhibits program behavior B 121 Code for D bool main(unsigned y) /* main for program D */ { program P = generate(y); if (PH(P,y)) while (1>0); else return (yes); } /* generate the yth string in SP* in enumeration order */ program generate(unsigned y) /* code for extra credit program of slide 21 from lecture 5 did this for {a,b}* */ bool PH(program P, unsigned x) /* how PH solves H is unknown */ 122 Visualization of D in action on input y • Program D with input y – (type for y: unsigned) 0 1 2 ... P0 P1 P2 H H H H NH H NH NH NH y ... ... Py NH H ... Given input y, generate the program (string) Py Run PH on Py and y • Guaranteed to halt since PH solves H IF (PH(Py,y)) while (1>0); else return (yes); D 123 D cannot be any program on list L • D cannot be program P0 because D behaves differently on 0 than P0 does on 0. – If P0 halts on 0, then D does not, and vice versa. • D cannot be program P1 because D behaves differently on 1 than P1 does on 1. – If P1 halts on 1, then D does not, and vice versa. • D cannot be program P2 because D behaves differently on 2 than P2 does on 2. – If P2 halts on 2, then D does not, and vice versa. • … 124 Alternate Proof 125 Alternate Proof Overview • For every program Py, there is a number y that we associate with it • The number we use to distinguish program Py from D is this number y • Using this idea, we can arrive at a contradiction without explicitly using the table L – The diagonalization is hidden 126 H is not solvable, proof II • Assume H is solvable – Let PH be the program which solves H – Use PH to construct program D which cannot exist • Contradiction – This means program PH cannot exist. – This implies H is not solvable • D is the same as before 127 Arguing D cannot exist • If D is a program, it must have an associated number y • What does D do on this number y? • 2 cases – D halts on y • This means PH(D,y) = NO – Definition of D • This means D does not halt on y – PH solves H • Contradiction • This case is not possible 128 Continued – D does not halt on this number y • This means PH(D,y) = YES – Definition of D • This means D halts on y – PH solves H • Contradiction • This case is not possible – Both cases are not possible, but one must be for D to exist – Thus D cannot exist 129 Placing the Halting Problem All Problems H Solvable 130 Implications * • The Halting Problem is one of the simplest problems we can formulate about program behavior • We can use the fact that it is unsolvable to show that other problems about program behavior are also unsolvable • This has important implications restricting what we can do in the field of software engineering – In particular, “perfect” debuggers/testers do not exist – We are forced to “test” programs for correctness even though this approach has many flaws 131 Summary • Halting Problem definition – Basic problem about program behavior • Halting Problem is unsolvable – We have identified a specific unsolvable problem – Diagonalization technique • Proof more complicated because we actually need to construct D, not just give a specification B 132 Module 8 • Halting Problem revisited – Universal Turing machine half-solves halting problem – A universal Turing machine is an operating system/general purpose computer 133 Half-solving the Halting Problem • State the Halting Problem • Give an input instance of the Halting Problem • We saw last time that the Halting Problem is not solvable. How might we half-solve the Halting Problem? 134 Example Input Program P bool main(unsigned Q) { int i=2; if ((Q = = 0) || (Q= = 1)) return false; while (i<Q) { if (Q%i = = 0) return (false); i++; } return (true); } Nonnegative integer 4 135 Organization Universal Turing machine’s Memory Program P Program P’s Memory int i,Q; 4 Program Counter Program P bool main(unsigned Q) { int i=2; if ((Q = = 0) || (Q= = 1)) return false; while (i<Q) { if (Q%i = = 0) return (false); i++; } return (true); } Line 1 136 Description of universal Turing machine * • Basic Loop – Find current line of program P – Execute current line of program P Program P • Update program P’s memory – Update program counter – Return to Top of Loop Program P’s Memory Program Counter 137 Past, Present, Future • Turing came up with the concept of a universal Turing machine in the 1930’s – This is well before the invention of the general purpose computer – People were still thinking of computing devices as special-purpose devices (calculators, etc.) – Turing helped move people beyond this narrow perspective • Turing/Von Neumann perspective – Computers are general purpose/universal algorithms • Focused on computation • Stand-alone • Today, we are moving beyond this view – Internet, world-wide web – However, results in Turing perspective still relevant 138 Debuggers • How are debugger’s like gdb or ddd related to universal Turing machines? • How do debuggers simplify the debugging process? 139 Placing the Halting Problem All Problems Half-solvable H Solvable 140 Summary • Universal Turing machines – 1930’s, Turing – Introduces general purpose computing concept – Not a super intelligent program, merely a precise follower of instructions • Halting Problem half-solvable but not solvable 141 Module 9 • Closure Properties – Definition – Language class definition • set of languages – Closure properties and first-order logic statements • For all, there exists 142 Closure Properties • A set is closed under an operation if applying the operation to elements of the set produces another element of the set • Example/Counterexample – set of integers and addition – set of integers and division 143 Integers and Addition 2 7 5 Integers 144 Integers and Division .4 2 5 Integers 145 Language Classes – We will be interested in closure properties of language classes • A language class is a set of languages • Thus, the elements of a language class (set of languages) are languages which are sets themselves – Crucial Observation • When we say that a language class is closed under some set operation, we apply the set operation to the languages (elements of the language classes) rather than the language classes themselves 146 Example Language Classes * • In all these examples, we do not explicitly state what the underlying alphabet S is • Solvable languages (REC) – Languages whose language recognition problem can be solved • Half-solvable languages (RE) – Languages whose language recognition problems can be halfsolved • Finite languages – Languages with a finite number of strings • CARD-3 – Languages with at most 3 strings 147 Finite Sets and Set Union * {a,b,aa} {a,b,aa,bb} {a,b,bb} Finite Languages All Languages 148 CARD-3 and Set Union {a,b,aa,bb} {a,b,aa} {a,b,bb} CARD-3 All Languages 149 Finite Languages and Set Complement {/\,aa,ba,bb,aaa,...} {a,b,ab} Finite Languages All Languages 150 Infinite Number of Facts • A closure property often represents an infinite number of facts • Example: The set of finite languages is closed under the set union operation – – – – – – {} union {} is a finite language {} union {l} is a finite language {} union {0} is a finite language ... {l} union {} is a finite language ... 151 First-order logic and closure properties * • A way to formally write (not prove) a closure property – " L1, ...,Lk in LC, op (L1, ... Lk) in LC – Only one expression is needed because of the for all quantifier • Number of languages k is determined by arity of the operation op 152 Example F-O logic statements * • " L1,L2 in FINITE, L1 union L2 in FINITE • " L1,L2 in CARD-3, L1 union L2 in CARD3 • " L in FINITE, Lc in FINITE • " L in CARD-3, Lc in CARD-3 153 Stating a closure property is false • What is true if a set is not closed under some k-ary operator? – There exist k elements of that set which, when combined together under the given operator, produce an element not in the set – $ L1, ...,Lk in LC, op (L1, …, Lk) not in LC • Example – Finite sets and set complement 154 Complementing a F-O logic statement • Complement “" L1,L2 in CARD-3, L1 union L2 in CARD-3” – not (" L1,L2 in CARD-3, L1 union L2 in CARD-3) – $ L1,L2 in CARD-3, not (L1 union L2 in CARD-3) – $ L1,L2 in CARD-3, L1 union L2 not in CARD-3 155 Proving/Disproving • Which is easier and why? – Proving a closure property is true – Proving a closure property is false 156 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 157 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 halfsolvable languages 158 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 159 REC and Set Complement REC ODD EVEN All Languages • • • • 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? 160 P’ Illustration P’ P Input x Yes/No No/Yes 161 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 */ 162 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 163 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 164 REC Closed Under Set Union L1 REC L1 U L2 L2 All Languages • 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 165 REC Closed Under Set Union L1 REC L1 U L2 – Construct program P3 from P1 and P2 as follows L2 All Languages – P3 solves L1 U L2 • Halts on all inputs • Answers correctly – L1 U L2 is solvable 166 P3 Illustration P1 Yes/No P3 P2 OR Yes/No Yes/No 167 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. */ 168 Other Closure Properties • Unary Operations – Language Reversal – Kleene Star • Binary Operations – – – – Set Intersection Set Difference Symmetric Difference Concatenation 169 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 170 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 ... 171 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 172 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 173 RE Closed Under Set Union L1 L1 U L2 L2 • 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 174 Constructing Program P3 L1 L1 U L2 L2 • 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? 175 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 176 P3 works correctly? bool main(string y) { if (P1(y)) return yes; else if (P2(y)) return yes; else return no; } – 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? 177 P3 works correctly? bool main(string y) { if (P1(y)) return yes; else if (P2(y)) return yes; else return no; } – 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? 178 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 */ 179 P3 works correctly? bool main(string y){ if ((P1(y) || P2(y)) return yes; else return no; } /* P1 and P2 run in parallel */ – 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? 180 RE and Set complement Lc RE L • 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 • ... 181 RE and Set complement Lc RE L • 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 182 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? 183 Other closure properties • Unary Operations – Language reversal – Kleene Closure • Binary operations – set intersection – concatenation • Not closed – Set difference (on practice hw) 184 Pseudo Closure Property • Lemma: If L and Lc are half-solvable, then L is solvable. • Question: What about Lc? 185 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 186 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? 187 Illustration S* L Lc P1 halts P2 halts 188 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 189 P3 Illustration P1 Input Yes Yes P3 P2 Yes No 190 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 */ 191 RE and REC All Languages RE L REC Lc 192 RE and REC All Languages Lc L Lc RE Lc REC Are there any languages L in RE - REC? 193 RE and REC All Languages RE Hc H REC So where does Hc belong? 194 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 195 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 196 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 197 Module 11 • Proving more specific problems are not solvable • Input transformation technique – Use subroutine theme to show that if one problem is unsolvable, so is a second problem – Need to clearly differentiate between • use of program as a subroutine and • a program being an input to another program 198 Basic Idea/Technique 199 Proving a problem L is unsolvable • Assume PL is a procedure that solves problem L – We have no idea how PL solves L • Construct a program PH that solves H using PL as a subroutine – We use PL as a black box – (We could use any unsolvable problem in place of H) • Argue PH solves H – But we know H is unsolvable • Conclude that L is unsolvable – Otherwise PL would exist and then H would be solvable 200 – L will be a problem about program behavior Focusing on H • In this module, we will typically use H, the Halting Problem, as our known unsolvable problem • The technique generalizes to using any unsolvable problem L’ in place of H. – You would need to change the proofs to work with L’ instead of H, but in general it can be done • The technique also can be applied to solvable problems to derive alternative consequences • We focus on H to simplify the explanation 201 Constructing PH using PL Answer-preserving input transformations and Program PT 202 PH has two subroutines • There are many ways to construct PH using program PL that solves L • We focus on one method in which PH consists of two subroutines – Procedure PL that solves L – Procedure PT which computes a function f that I call an answer-preserving (or answer-reversing) input transformation • More about this in a moment 203 Two Representations of PH * P,y PT PT(P,y) PL Y/N Yes/No PH bool PH (Program P, unsigned y) { return PL (PT (P,y)); } 204 Answer-preserving input transformation PT • Input – An input to H • Output – An input to L such that • yes inputs of H map to yes inputs of L • no inputs of H map to no inputs of L • Note, PT must not loop when given any legal input to H 205 Why this works * yes input to H no input to H PT yes input to L no input to L PL yes no PH We have assumed that PL solves L bool PH (Program P, unsigned y) { return PL (PT (P,y)); } 206 Answer-reversing input transformation PT • Input – An input to H • Output – An input to L such that • yes inputs of H map to no inputs of L • no inputs of H map to yes inputs of L • Note, PT must not loop when given any legal input to H 207 Why this works yes input to H no input to H PT no input to L yes input to L PL no yes yes no PH We have assumed that PL solves L bool PH (unsigned x) { return complement(PL (PT (P,y))); } 208 Yes→Yes and No→No x PT PT(x) PL PH Yes/No No inputs for H Yes inputs for H Domain of H Yes inputs for L No inputs for L Domain of L 209 Notation and Terminology Yes inputs No inputs Domain of H Yes inputs No inputs Domain of L • If there is such an answer-preserving (or answer-reversing) input transformation f (and the corresponding program PT), we say that H transforms to (many-one reduces to) L • Notation H≤L 210 Examples not involving the Halting Problem 211 Generalization • While we focus on transforming H to other problems, the concept of transformation generalizes beyond H and beyond unsolvable program behavior problems • We work with some solvable, language recognition problems to illustrate some aspects of the transformation process in the next few slides 212 Yes inputs Example 1 No inputs Domain of L1 Yes inputs No inputs Domain of L2 • L1 is the set of even length strings over {0,1} – What are the set of legal input instances and no inputs for the L1 LRP? • L2 is the set of odd length strings over {0,1} – Same question as above • Tasks – Give an answer-preserving input transformation f that shows that L1 LRP ≤ L2 LRP – Give a corresponding program PT that computes f 213 Program PT string main(string x) { return(x concatenate “0”); } 214 Yes inputs Example 2 No inputs Domain of L1 Yes inputs No inputs Domain of L2 • L1 is the set of all strings over {0,1} – What is the set of all inputs, yes inputs, no inputs for the L1 LRP? • L2 is {0} – Same question as above • Tasks – Give an answer-preserving input transformation f which shows that the L1 LRP ≤ L2 LRP – Give a corresponding program PT which computes f 215 Program PT string main(string x) { return( “0”); } 216 Yes inputs Example 3 No inputs Domain of L1 Yes inputs No inputs Domain of L2 • L1 – Input: Java program P that takes as input an unsigned int – Yes/No Question: Does P halt on all legal inputs • L2 – Input: C++ program P that takes as input an unsigned int – Yes/No Question: Does P halt on all legal inputs • Tasks – Describe what an answer-preserving input transformation f that shows that L1 ≤ L2 would be/do? 217 Proving a program behavior problem L is unsolvable 218 Problem Definitions * • Halting Problem H – Input • Program QH that has one input of type unsigned int • non-negative integer y that is input to program QH – Yes/No Question • Does QH halt on y? • Target Problem L – Input • Program QL that has one input of type string – Yes/No question • Does Y(QL) = the set of even length strings? • Assume program PL solves L 219 Construction review x PT PT(x) PL Y/N Yes/No PH •We are building a program PH to solve H •PH will use PL as a subroutine •PH will use PT as a subroutine, and we must explicitly construct PT using specific properties of H and L bool PH (unsigned x) { return PL (PT (P,y)); } 220 P’s and Q’s • Programs which are PART of program PH and thus “executed” when PH executes – Program PT, an actual program we construct – Program PL, an assumed program which solves problem L • Programs which are INPUTS/OUTPUTS of programs PH, PL, and PT and which are not “executed” when PH executes – Programs QH, QL, and QYL • code for QYL is available to PT 221 Two inputs for L * • Target Problem L – Input • Program Q that has one input of type string – Yes/No question • Does Y(Q) = the set of even length strings? • Program PL – Solves L – We don’t know how • Consider the following program Q1 bool main(string z) {while (1>0) ;} – What does PL output when given Q1 as input? • Consider the following program Q2 bool main(string z) { if ((z.length %2) = = 0) return (yes) else return (no); } – What does PL output when given Q2 as input? 222 Another input for L * • Target Problem L – Input • Program Q that has one input of type string – Yes/No question • Does Y(Q) = the set of even length strings? • Program PL – Solves L – We don’t know how • Consider the following program QL with 2 procedures Q1 and QYL bool main(string z) { Q1(5); /* ignore return value */ return(QYL(z)); } bool Q1(unsigned x) { if (x > 3) return (no); else loop; } bool QYL(string y) { if ((y.length( ) % 2) = = 0) return (yes); else return(no); } • What does PL output when given QL as input? 223 Input and Output of PT * • Input of PT (and H) • Program QL that is the output of PT and input of L – Program QH • one input of type unsigned int – Non-negative integer y QH,y PT QL bool main(string z) { QH(y); /* QH and y come left-hand side */ /* ignore return value */ return(QYL(z)); } bool QH(unsigned x) { /* comes from left-hand side } bool QYL(string y) { if ((y.length( ) % 2) = = 0) return (yes); else return(no); } 224 Example 1 * QH,y PT QL Input to PT Output of PT Program QH bool main(unsigned y) { if (y ==5) return yes; else if (y ==4) return no; else while (1>0) {}; } Program QL bool QH(unsigned y) { if (y ==5) return yes; else if (y ==4) return no; else while (1>0) {}; } bool QYL(string z) { if ((z.length % 2) == 0) return (yes) else return (no); } bool main(string z) { unsigned y = 5; QH(y); return (QYL(z)); } Non-negative integer y 5 225 Example 2 QH,y PT QL Input to PT Output of PT Program QH bool main(unsigned y) { if (y ==5) return yes; else if (y ==4) return no; else while (1>0) {}; } Program QL bool QH(unsigned y) { if (y ==5) return yes; else if (y ==4) return no; else while (1>0) {}; } bool QYL(string z) { if ((z.length % 2) == 0) return (yes) else return (no); } bool main(string z) { unsigned y = 3; QH(y); return (QYL(z)); } Non-negative integer y 3 226 PT in more detail 227 QH,y Declaration of PT PT QL PL Yes/No PH • What is the return type of PT? – Type program1 (with one input of type string) • What are the input parameters of PT? – The same as the input parameters to H; in this case, • type program2 (with one input of type unsigned int) • unsigned int (input type to program2) program1 main(program2 QH, unsigned y) 228 Code for PT QH,y PT QL PL Yes/No PH program1 main(program2 QH, unsigned y) { /* Will be viewing types program1 and program2 as STRINGS over the program alphabet SP */ program1 QL = replace-main-with-QH(QH); /* Insert line break */ QL += “\n”; /* Insert QYL */ QL += “bool QYL(string z) {\n \t if ((z.length % 2) == 0) return (yes) else return (no);\n }”; /* Add main routine of QL */ QL += “bool main(string z) {\n\t”; /* determined by L */ QL += “unsigned y =” QL += convert-to-string(y); QL += “;\n\t QH(y)\n\t return(QYL(z));\n}”; return(QL); } program1 replace-main-with-QH(program2 P) /* Details hidden */ string convert-to-string(unsigned y) /* Details hidden */ 229 QH,y PT in action PT QL PL Yes/No PH Program QH Program QL bool main(unsigned y) { if (y ==5) return yes; else if (y ==4) return no; else while (1>0) {}; } bool QH(unsigned y) { if (y ==5) return yes; else if (y ==4) return no; else while (1>0) {}; } bool QYL(string z) { if ((z.length % 2) == 0) return (yes) else return (no); } bool main(string z) { unsigned y = 5; QH(y); return (QYL(z)); } Input y 5 PT code for QYL 230 Constructing QL (and thus PT) How to choose QYL or QNL 231 Start with no input for H • Program QL • If QH, y is a no input bool main(string z) { to the Halting problem QH(y); /* ignore return value */ return(Q?L(z)); /* yes or no? */ – QH loops on y – Thus Y(QL) = {} – Determine if this makes QL a no or yes input instance to L } bool QH(unsigned x) { /* comes from left-hand side } bool Q?L(string y) { } 232 Answer-preserving input transformation • Program QL • If QH, y is a no input bool main(string z) { to the Halting problem QH(y); /* ignore return value */ return(QYL(z)); /* yes */ – QH loops on y – Thus Y(QL) = {} – Determine if this makes QL a no or yes input instance to L – Now choose a QYL (or QNL) that is a yes (or no) input instance to L } bool QH(unsigned x) { /* comes from left-hand side } bool QYL(string y) { } 233 Make yes for H map to yes for L • Program QL • If QH, y is a no input bool main(string z) { to the Halting problem QH(y); /* ignore return value */ return(QYL(z)); /* yes */ – QH loops on y – Thus Y(QL) = {} – Determine if this makes QL a no or yes input instance to L – Now choose a QYL (or QNL) that is a yes (or no) input instance to L } bool QH(unsigned x) { /* comes from left-hand side } bool QYL(string y) { if ((y.length( ) % 2) = = 0) return (yes); else return (no); } 234 Possible shortcut Program QL bool main(string z) { QH(y); /* ignore return value */ return(QYL(z)); /* yes */ } bool QH(unsigned x) { /* comes from left-hand side } bool QYL(string y) { if ((y.length( ) % 2) = = 0) return (yes); else return (no); Program QL bool main(string z) { QH(y); /* ignore return value */ if ((z.length( ) % 2) = = 0) return (yes); else return (no); } bool QH(unsigned x) { /* comes from left-hand side } } 235 Another Example 236 Problem Definitions • Halting Problem H – Input • Program QH that has one input of type unsigned int • non-negative integer y that is input to program QH – Yes/No Question • Does QH halt on y? • Target Problem L – Input • Program QL that has one input of type string – Yes/No question • Is Y(QL) finite? • Assume program PL solves L 237 Start with no input for H • Program QL • If QH, y is a no input bool main(string z) { to the Halting problem QH(y); /* ignore return value */ return(Q?L(z)); /* yes or no? */ – QH loops on y – Thus Y(QL) = {} – Determine if this makes QL a no or yes input instance to L } bool QH(unsigned x) { /* comes from left-hand side } bool Q?L(string y) { } 238 Answer-reversing input transformation • Program QL • If QH, y is a no input bool main(string z) { to the Halting problem QH(y); /* ignore return value */ return(QNL(z)); /* no */ – QH loops on y – Thus Y(QL) = {} – Determine if this makes QL a no or yes input instance to L – Now choose a QYL (or QNL) that is a yes (or no) input instance to L } bool QH(unsigned x) { /* comes from left-hand side } bool QNL(string y) { } 239 Make yes for H map to no for L • Program QL • If QH, y is a no input bool main(string z) { to the Halting problem QH(y); /* ignore return value */ return(QNL(z)); /* no */ – QH loops on y – Thus Y(QL) = {} – Determine if this makes QL a no or yes input instance to L – Now choose a QYL (or QNL) that is a yes (or no) input instance to L } bool QH(unsigned x) { /* comes from left-hand side } bool QNL(string y) { if ((y.length( ) % 2) = = 0) return(yes); else return(no); } 240 Analyzing proposed transformations 4 possibilities 241 Problem Setup • Input of Transformation • Program QH, unsigned x • Output of Transformation • Program QL • Problem L • bool main(string z) { QH(y); /* ignore return value */ return(QYL(z)); /* yes or no */ } bool QH(unsigned x) {} bool QYL(string y) { if ((y.length( ) % 2) = = 0) return (yes); else return (no); • Input: Program P • Yes/No Question: Is Y(P) = {aa}? Question: Is the transformation on the left an answerpreserving or answerreversing input transformation from H to problem L? } 242 Key Step • Input of Transformation • Program QH, unsigned x • Output of Transformation • Program QL • Problem L • bool main(string z) { QH(y); /* ignore return value */ return(QYL(z)); /* yes or no */ } bool QH(unsigned x) {} bool QYL(string y) { if ((y.length( ) % 2) = = 0) return (yes); else return (no); • Input: Program P • Yes/No Question: Is Y(P) = {aa}? The output of the transformation is the input to the problem. • Plug QL in for program P above • Is Y(QL) = {aa}? } 243 Is Y(QL) = {aa}? • Input of Transformation • Program QH, unsigned x • Output of Transformation • Program QL • Problem L • Input: Program P • Yes/No Question: Is Y(P) = {aa}? • Analysis • If QH loops on x, Y(QL)={} bool main(string z) { • No input to H creates a QL QH(y); /* ignore return value */ that is a no input for L return(QYL(z)); /* yes or no */ • If QH halts on x, Y(QL) = } {even length strings} bool QH(unsigned x) {} • Yes input to H creates a QL bool QYL(string y) { that is a no input for L if ((y.length( ) % 2) = = 0) return (yes); • Transformation does not work else return (no); • All inputs map to no inputs } 244 Three other problems • Input of Transformation • Program QH, unsigned x • Output of Transformation • Program QL • Problem L1 • Input: Program P • Yes/No Question: Is Y(P) infinite? • Problem L2 bool main(string z) { QH(y); /* ignore return value */ return(QYL(z)); /* yes or no */ } • bool QH(unsigned x) {} bool QYL(string y) { if ((y.length( ) % 2) = = 0) return (yes); else return (no); • Input: Program P • Yes/No Question: Is Y(P) finite? Problem L3 • Input: Program P • Yes/No Question: Is Y(P) = {} or is Y(P) infinite? } 245 Is Y(QL) infinite? • Input of Transformation • Program QH, unsigned x • Output of Transformation • Program QL • Problem L1 • Input: Program P • Yes/No Question: Is Y(P) infinite? • Analysis • If QH loops on x, Y(QL)={} bool main(string z) { • No input to H creates a QL QH(y); /* ignore return value */ that is a no input for L return(QYL(z)); /* yes or no */ • If QH halts on x, Y(QL) = } {even length strings} bool QH(unsigned x) {} • Yes input to H creates a QL bool QYL(string y) { that is a yes input for L if ((y.length( ) % 2) = = 0) return (yes); • Transformation works else return (no); • Answer-preserving } 246 Is Y(QL) finite? • Input of Transformation • Program QH, unsigned x • Output of Transformation • Program QL • Problem L2 • Input: Program P • Yes/No Question: Is Y(P) finite? • Analysis • If QH loops on x, Y(QL)={} bool main(string z) { • No input to H creates a QL QH(y); /* ignore return value */ that is a yes input for L return(QYL(z)); /* yes or no */ • If QH halts on x, Y(QL) = } {even length strings} bool QH(unsigned x) {} • Yes input to H creates a QL bool QYL(string y) { that is a no input for L if ((y.length( ) % 2) = = 0) return (yes); • Transformation works else return (no); • Answer-reversing } 247 Is Y(QL) = {} or is Y(QL) infinite? • Input of Transformation • Program QH, unsigned x • Output of Transformation • Program QL • Problem L3 • Input: Program P • Yes/No Question: Is Y(P) = {} or is Y(P) infinite? • Analysis • If QH loops on x, Y(QL)={} bool main(string z) { • No input to H creates a QL QH(y); /* ignore return value */ that is a yes input for L return(QYL(z)); /* yes or no */ • If QH halts on x, Y(QL) = } {even length strings} bool QH(unsigned x) {} • Yes input to H creates a QL bool QYL(string y) { that is a yes input for L if ((y.length( ) % 2) = = 0) return (yes); • Transformation does not work else return (no); • All inputs map to yes inputs } 248