Dimensions in Synthesis Part 2: Applications (Intelligent Tutoring Systems) Sumit Gulwani sumitg@microsoft.com Microsoft Research, Redmond May 2012 Recap Domain Insight Bit-vector Algorithms Geometry Constructions Testing & Symbolic verification Testing is Verification runs in reasonable time probabilistically sound Synthesis Strategy Counter-example guided inductive synthesis Brute-force search: Generate and Test 1 Potential Users of Synthesis Technology Algorithm Designers Software Developers Most Useful Target Most Transformational Target End-Users Students and Teachers • Vision for End-users: Enable people to have (automated) personal assistants. • Vision for Education: Enable every student to have access to free & high-quality education. 2 Intelligent Tutoring Systems • Motivation – Online learning sites: Khan academy, Edx, Udacity, Coursera • Increasing class sizes with even less personal attention – New technologies: Tablets/Smartphones, NUI, Cloud • Various Aspects – – – – Solution Generation Problem Generation Automated Grading/Feedback Content Entry • Various Domains – K-12: Mathematics, Physics, Chemistry – Undergraduate: Introductory Programming, Automata Theory – Language Learning 3 Intelligent Tutoring Systems • Aspects – – – – Solution Generation Problem Generation Automated Grading Content Entry • Domains – – – – – – Geometry Algebra Introductory Programming Automata Theory Physics Chemistry โฎ Joint work with: Cerny, Henzinger, Radhakrishna, Zufferey 4 Classic Problem in Automata Theory Course Let L be the language containing all strings over {a,b} that have the same number of occurrences of “ab” as occurrences of “ba”. Construct an automata that accepts L, or prove that L is non-regular. Solution Generation Engine “Regular”, <Automata for L> 5 Classic Problem in Automata Theory Course Let L be the language containing all strings over {a,b} that have the same number of occurrences of “a” as occurrences of “b”. Construct an automata that accepts L, or prove that L is non-regular. Solution Generation Engine “Non-regular”, <Proof of non-regularity> 6 Outline ๏ Formal Description of Input • Regular Languages – Algorithm for automata synthesis. • Non-regular Languages – Formal description of non-regularity proof. – Algorithm for proof synthesis. 7 Formal Description of Input Problem Description Languages Examples • User-friendly logic • Context-free grammar Interfaces • Membership Test – Required for inductive synthesis of automata or non-regularity proof. • Symbolic Membership Test – Required for verification of non-regularity proof. 8 User-friendly Logic • same number of occurrences of “ab” as that of “ba”. – ๐๐๐ข๐๐ก(๐ค, “๐๐”) = ๐๐๐ข๐๐ก(๐ค, “๐๐”) • all occurrences of “ab” start on an even position. – ∀๐: ((1 < ๐ < ๐ฟ๐๐๐๐กโ ๐ค ∧ ๐๐๐๐ก๐๐๐๐ ๐ค, “๐๐”, ๐) ⇒ ๐ ๐๐๐ 2 = 0 ) • consists of n a’s followed by n b’s. – ๐ค = ๐๐๐๐๐๐ก๐๐๐๐ก๐(๐๐๐๐๐๐ก(“๐”, ๐), ๐๐๐๐๐๐ก(“๐”, ๐)) 9 Outline • Formal Description of Input • Regular Languages ๏ Algorithm for automata synthesis. • Non-regular Languages – Formal description of non-regularity proof. – Algorithm for proof synthesis. 10 Automata Generation for Regular Languages We use Angluin’s L* algorithm. • Membership Oracle – Provided by the PDL interface. • Equivalence Oracle – Can be simulated using Membership Oracle on bit-strings of size at most 2n, where n is the # of automata states. – Theorem: Let ๐ด be a DFA with ๐1 states, let ๐ต be a DFA with ๐2 states. If ๐ฟ ๐ด ≠ ๐ฟ ๐ต , then there exists a word ๐ค in L A − L B ∪ ๐ฟ ๐ต − ๐ฟ ๐ด , such that the length of ๐ค is at most ๐1 + ๐2 − 1. 11 Distribution of Automata sizes 35 30 25 # of 20 problems 15 10 5 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Automata Size The automata size of educational problems is small! 12 Distribution of counterexample lengths (relative to automata size) 40 35 30 25 # of 20 problems 15 10 5 0 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 Counterexample length – automata size The counterexample lengths are quite smaller than worst-case possibility of twice the automata size. 13 Outline • Formal Description of Input • Regular Languages – Algorithm for automata synthesis. • Non-regular Languages ๏ Formal description of non-regularity proof. – Algorithm for proof synthesis. 14 Myhill-Nerode Theorem: Non-regularity Condition A language ๐ฟ is non-regular iff there exist functions ๐น: ๐ → Σ ∗ and ๐บ: ๐ → Σ ∗ such that: ∀๐, ๐: 1 ≤ ๐ < ๐ ⇒ ๐น ๐ ๐บ ๐, ๐ ∈ ๐ฟ ∧ ๐น ๐ ๐บ ๐, ๐ ∉ ๐ฟ ๐๐ ๐น ๐ ๐บ ๐, ๐ ∉ ๐ฟ ∧ ๐น ๐ ๐บ ๐, ๐ ∈ ๐ฟ The above characterization can be shown equivalent to: ∀๐, ๐: 1 ≤ ๐ < ๐ ⇒ ๐น ๐ ๐บ ๐, ๐ ∈ ๐ฟ ∧ ๐น ๐ ๐บ ๐, ๐ ∉ ๐ฟ ๐๐ ∀๐, ๐: 1 ≤ ๐ < ๐ ⇒ ๐น ๐ ๐บ ๐, ๐ ∉ ๐ฟ ∧ ๐น ๐ ๐บ ๐, ๐ ∈ ๐ฟ This allows for automation! We refer to F/G as congruence/witness functions. 15 Examples of Congruence/Witness Functions • Same number of occurrences of “a” as that of “b”. Congruence Function: ๐๐ Witness Function: ๐ ๐ • Same number of occurrences of “a” as that of “b”. Congruence Function: ๐๐ ๐ Witness Function: ๐ ๐ • ๐ค๐ค ๐ ๐ค ∈ 0,1 ∗ }. Congruence Function: ๐๐ ๐ Witness Function: ๐๐๐ 16 Language for Congruence/Witness Functions The following language is expressive enough to represent Congruence function F(i) and Witness Function G(i,j) for several classroom problems. ๐ โ ๐ก1 ๐ก2 … ๐ก๐ ๐ก โ ๐ ๐๐ ๐๐ where c is any alphabet. 17 Outline • Formal Description of Input • Regular Languages – Algorithm for automata synthesis. • Non-regular Languages – Formal description of non-regularity proof. ๏ Algorithm for proof synthesis. 18 Algorithm for constructing Congruence/Witness Fns. 1. Approximation – Run L* algorithm using counterexamples of size ≤ ๐. 2. Generation (using Inductive Synthesis) – For each eq. class, generate all congruence functions that evaluate to a string in that class. Intersect pairs of such sets to generate candidates. – For each candidate congruence fn., use similar methodology to generate candidate witness fn. 3. Testing based Validation – Test correctness of candidate fns. on 1 ≤ ๐ < ๐ ≤ 10 4. Verification – Use symbolic inference rules to verify correctness. 5. Refinement – If any of steps 2,3,4 fail, repeat with larger value of k. 19 Experimental Results Id PDL 1 UFPDL 5 0.1 ๐๐ ๐๐ 0.1 0.1 2 UFPDL 5 0.2 ๐๐ ๐๐ 0.1 0.1 3 UFPDL 5 0.9 ๐๐ ๐๐ 0.1 0.1 3 CFG 5 0.4 ๐๐ ๐๐ 0.1 0.1 4 UFPDL 5 1.6 ๐๐ ๐๐ 0.1 0.2 5 CFG 10 0.2 ๐๐ ๐ ๐๐๐ 0.1 0.1 6 CFG 5 0.1 ๐๐ ๐๐ 0.1 0.1 9 CFG 10 0.1 ๐๐ ๐ ๐๐ 0.1 0.1 11 UFPDL 8 12.1 ๐๐ ๐ ๐๐ 0.4 0.1 12 UFPDL 5 10.1 ๐๐ ๐๐ 0.4 0.2 13 UFPDL 5 6.4 ๐๐ ๐๐ ๐ ๐ 0.2 0.1 15 UFPDL 7 7.8 ๐๐ ๐ ๐๐ 1.1 0.1 15 CFG 7 0.1 ๐๐ ๐๐๐ 0.1 0.1 16 CFG 5 0.2 ๐๐ ๐๐ 0.1 0.1 17 UFPDL 5 1.6 ๐๐ ๐๐ 0.4 0.1 18 CFG 5 0.3 ๐๐ ๐ ๐๐ 0.1 0.1 19 UFPDL 10 15.8 ๐๐ ๐ ๐๐ 4.5 1.7 21 CFG 5 0.5 (๐ )๐ 0.1 0.1 ๐ต≡ Generation Congruence Fn. ๐ Witness Fn. Test Verify 20 Intelligent Tutoring Systems • Aspects – – – – Solution Generation Problem Generation Automated Grading Content Entry • Domains – – – – – – Geometry Algebra Introductory Programming Automata Theory Physics Chemistry โฎ AAAI 2012: Singh, Gulwani, Rajamani. 21 Trigonometry Problem Example Problem: sec ๐ฅ + cos ๐ฅ Query: ๐1 ๐ฅ ± ๐2 (๐ฅ) ๐1 ≠ ๐5 sec ๐ฅ − cos ๐ฅ = tan2 ๐ฅ + sin2 ๐ฅ ๐3 ๐ฅ ± ๐4 ๐ฅ = ๐52 ๐ฅ ± ๐62 (๐ฅ) New problems generated: csc ๐ฅ + cos ๐ฅ csc ๐ฅ − cos ๐ฅ = cot 2 ๐ฅ + sin2 ๐ฅ (csc ๐ฅ − sin ๐ฅ)(csc ๐ฅ + sin ๐ฅ) = cot 2 ๐ฅ + cos 2 ๐ฅ (sec ๐ฅ + sin ๐ฅ)(sec ๐ฅ − sin ๐ฅ) = tan2 ๐ฅ + cos 2 ๐ฅ : (tan ๐ฅ + sin ๐ฅ)(tan ๐ฅ − sin ๐ฅ) = tan2 ๐ฅ − sin2 ๐ฅ (csc ๐ฅ + cos ๐ฅ)(csc ๐ฅ − cos ๐ฅ) = csc 2 ๐ฅ − cos 2 ๐ฅ : 22 Algebra Problem Generation Example Problem Query Generation Query Refined Query Query Execution New Problems Results OK? No Query Refinement Yes Similar Problems 23 Limits/Series Problem ๐ Example Problem: ๐ Query: lim ๐→∞ ๐=0 lim ๐→∞ ๐=0 2๐ 2 + ๐ + 1 5 = ๐ 2 5 ๐ถ0 ๐ 2 + ๐ถ1 ๐ + ๐ถ2 ๐ถ3 ๐ ๐ถ4 = ๐ถ5 C0 ≠ 0 ∧ gcd ๐ถ0 , ๐ถ1 , ๐ถ2 = gcd ๐ถ4 , ๐ถ5 = 1 New problems generated: ๐ lim ๐→∞ ๐=0 ๐ lim ๐→∞ ๐=0 ๐ 2 3๐ + 2๐ + 1 7 = ๐ 3 7 lim ๐→∞ ๐ 2 ๐ 3 = ๐ 2 3 ๐=0 lim ๐→∞ ๐=0 3๐ 2 + 3๐ + 1 =4 ๐ 4 5๐ 2 + 3๐ + 3 =6 ๐ 6 24 Integration Problem Example Problem: Query: (csc ๐ฅ) (csc ๐ฅ − cot ๐ฅ) ๐๐ฅ = csc ๐ฅ − cot ๐ฅ ๐0 ๐ฅ ๐1 ๐ฅ ± ๐2 ๐ฅ ๐๐ฅ = ๐4 ๐ฅ ± ๐5 (๐ฅ) ๐1 ≠ ๐2 ∧ ๐4 ≠ ๐5 New problems generated: (tan ๐ฅ) (cos ๐ฅ + sec ๐ฅ) ๐๐ฅ = sec ๐ฅ − cos ๐ฅ (sec ๐ฅ) (tan ๐ฅ + sec ๐ฅ) ๐๐ฅ = sec ๐ฅ + cot ๐ฅ (cot ๐ฅ) (sin ๐ฅ + csc ๐ฅ) ๐๐ฅ = sin ๐ฅ − csc ๐ฅ 25 Determinant Problem Ex. Problem ๐ฅ+๐ฆ ๐ง๐ฅ ๐ฆ๐ง 2 ๐ง๐ฅ ๐ฆ+๐ง ๐ฅ๐ฆ ๐น0 (๐ฅ, ๐ฆ, ๐ง) ๐น1 (๐ฅ, ๐ฆ, ๐ง) Query ๐น3 (๐ฅ, ๐ฆ, ๐ง) ๐น4 (๐ฅ, ๐ฆ, ๐ง) ๐น6 (๐ฅ, ๐ฆ, ๐ง) ๐น7 (๐ฅ, ๐ฆ, ๐ง) 2 ๐ง๐ฆ ๐ฅ๐ฆ ๐ง+๐ฅ = 2๐ฅ๐ฆ๐ง ๐ฅ + ๐ฆ + ๐ง 3 2 ๐น2 (๐ฅ, ๐ฆ, ๐ง) ๐น5 (๐ฅ, ๐ฆ, ๐ง) ๐น8 (๐ฅ, ๐ฆ, ๐ง) = ๐ถ10 ๐น9 (๐ฅ, ๐ฆ, ๐ง) ๐น๐ โ ๐น๐ ๐ฅ → ๐ฆ; ๐ฆ → ๐ง; ๐ง → ๐ฅ ๐คโ๐๐๐ ๐, ๐ ∈ { 4,0 , 8,4 , 5,1 , … } New problems generated: ๐ฆ2 ๐ง+๐ฆ ๐ง2 2 ๐ฆ๐ง + ๐ฆ 2 ๐ฆ๐ง ๐ง๐ฅ ๐ฅ2 ๐ง2 ๐ฅ+๐ง ๐ฅ๐ฆ ๐ง๐ฅ + ๐ง 2 ๐ง๐ฅ 2 ๐ฆ+๐ฅ ๐ฆ2 ๐ฅ2 ๐ฅ๐ฆ ๐ฆ๐ง ๐ฅ๐ฆ + ๐ฅ 2 2 = 2 ๐ฅ๐ฆ + ๐ฆ๐ง + ๐ง๐ฅ 3 = 4๐ฅ 2 ๐ฆ 2 ๐ง 2 26 Intelligent Tutoring Systems • Aspects – – – – Solution Generation Problem Generation Automated Grading Content Entry • Domains – – – – – – Geometry Algebra Introductory Programming Automata Theory Physics Chemistry โฎ Arxiv TR 2012: Rishabh Singh, Gulwani, Armando Solar-Lezama . 27 Background: PexForFun 28 Buggy Program for Array Reverse using System; 6:28::50 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { b[count] = a[i]; count++; } return b; }} 29 Buggy Program for Array Reverse using System; 6:32::01 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length-1; i < a.Length-1; i--) { b[count] = a[i]; count++; } return b; }} 30 Buggy Program for Array Reverse using System; 6:32::32 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length-1; i < a.Length-1; i--) { b[count] = a[i]; count++; } return b; }} No change! Sign of Frustation? 31 Buggy Program for Array Reverse using System; 6:33::19 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i <= a.Length; i--) { b[count] = a[i]; count++; } return b; }} 32 Buggy Program for Array Reverse using System; 6:33::55 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { Console.Writeline(i); b[count] = a[i]; count++; } return b; }} Same as initial attempt except Console.Writeline! 33 Buggy Program for Array Reverse using System; 6:34::06 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { Console.Writeline(i); b[count] = a[i]; count++; } return b; }} No change! Sign of Frustation? 34 Buggy Program for Array Reverse using System; 6:34::56 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i <= a.Length; i--) { Console.Writeline(i); b[count] = a[i]; count++; } return b; }} The student has tried this before! 35 Buggy Program for Array Reverse using System; 6:36::24 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { b[count] = a[i]; count++; } return b; }} Same as initial attempt! 36 Buggy Program for Array Reverse using System; 6:37::39 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length-1; i < a.Length-1; i--) { b[count] = a[i]; count++; } return b; }} The student has tried this before! 37 Buggy Program for Array Reverse using System; 6:38::11 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i > 0; i--) { b[count] = a[i]; count++; } return b; }} Almost correct! (a[i-1] instead of a[i] in loop body) 38 Buggy Program for Array Reverse using System; 6:38::44 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i >= 0; i--) { b[count] = a[i]; count++; } return b; }} Student going in wrong direction! 39 Buggy Program for Array Reverse using System; 6:39::33 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { b[count] = a[i]; count++; } return b; }} Back to bigger error! 40 Buggy Program for Array Reverse using System; 6:39::45 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { b[count] = a[i]; count++; } return b; }} No change! Frustation! 41 Buggy Program for Array Reverse using System; 6:40::27 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { b[count] = a[i]; count++; } return b; }} No change! More Frustation!! 42 Buggy Program for Array Reverse using System; 6:40::57 AM public class Program { public static int[] Puzzle(int[] a) { int[] b = new int[a.Length]; int count = 0; for(int i=a.Length; i < a.Length; i--) { b[count] = a[i]; count++; } return b; }} No change! Too Frustated now!!! Gives up. 43 Proposal: Semantic Grading Provides additional value over counterexample feedback. • More friendly feedback. – Helpful for students who give up after several tries (with only counterexample feedback). • Grading – Counterexample feedback does not distinguish between a slightly incorrect solution and one that is very far off from being correct. 44 Demo 45 Relation with Automated Bug Fixing Simplifying Assumptions • Correct solution is known. • Errors are predictable. • Programs are small. Challenging Aspects • No logical specification. – Instead program equivalence. • Higher density of errors than production code. • Generate multiple fixes – To remain faithful to the student’s thought process. 46 Technique • Teacher provides: – A reference implementation – Model of errors that students make • Sketch encoding: – Fuzz the program using error model. – Use a counter to keep track of number of changes. • Sketch solving: – To generate minimal fixes, assert (counter = i) for increasing values of i. – Use off-the-shelf SAT solver to explore the state space of possible corrections. 47 Error Model for Array Reverse Problem Array Index Fuzzing: v[a] -> v[{a+1, a-1, v.Length-a-1}] Initialization Fuzzing: v=n -> v={n+1, n-1, 0} Increment Fuzzing: v++ -> { ++v, v--, --v } Return Value Fuzzing: return v -> return ?v Conditional Fuzzing: a op b -> a’ ops { a+1, a-1, 0 } where ops = { <, >, <=, >=, ==, != } 48 Fraction of Programs fixed Effectiveness of Error Models 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 Array Reverse Palindrome Max Factorial isIncreasing Sort F1 F2 F3 F4 F5 Error Models 49 Efficiency of Error Models Running Time (in s) 35 30 Array Reverse 25 Palindrome 20 Max 15 isIncreasing 10 Factorial Sort 5 0 F1 F2 F3 F4 F5 Error Models 50 Number of Programs Fixed Generality of Error Models 80 70 60 50 40 30 20 Specific Error Model Array Reverse Error Model 10 0 51 Experimental Results Benchmark Total Fixed Changes Time(s) Array Reverse 305 254 1.73 2.69 String Palindrome 86 64 1.28 3.52 Array Maximum 99 68 1.25 7.47 Is Increasing Order 51 38 1.72 3.56 Array Sort 74 35 1.17 32.46 Factorial 70 30 1.25 4.99 Friday Rush 17 4 1 12.42 52 Potential Workflow Teacher grades an ungraded answer-script. System generalizes corrections into error models. System performs automated grading by considering all possible combinations and instantiations of all error models. Any ungraded answer scripts? Yes No 53 Intelligent Tutoring Systems • Aspects – – – – Solution Generation Problem Generation Automated Grading Content Entry • Domains – – – – – – Geometry Algebra Introductory Programming Automata Theory Physics Chemistry โฎ Joint work with: Alex Polozov and Sriram Rajamani 54 Mathematical Intellisense State-of-the-art Mathematical Editors • Text editors like Latex – Unreadable text in prefix notation • WYSIWIG editors like Microsoft Word – Change of cursor positions multiple times. – Back and forth switching between mouse & keyboard Our proposal: An intelligent predictive editor. • Mathematical text has low entropy and hence amenable to prediction! 55 Reducing (Term) Prediction to Learning-By-Examples Terms connected by the same AC operator can be thought of as terms belonging to a sequence. There are 2 opportunities for predicting such terms. Sequence Creation: T1, T2, T3, … • Learn a function F such that F(Ti) = Ti+1 Sequence Transformation: T1, T2, T3, T4 -> S1, S2, … • Learn a function F such that F(Ti) = Si 56 Mathematical (Syntactic) Intellisense tan 3๐ฅ tan 2๐ฅ tan ๐ฅ = tan 3๐ฅ − tan 2๐ฅ − tan ๐ฅ ๐ฆ๐ง − ๐ฅ 2 ๐ง๐ฅ − ๐ฆ 2 ๐ฅ๐ฆ − ๐ง 2 ๐ด1 sin3 ๐ผ ๐ด2 sin ๐ผ ๐ง๐ฅ − ๐ฆ 2 ๐ฅ๐ฆ − ๐ง 2 ๐ฆ๐ง − ๐ฅ 2 ๐ต1 sin3 ๐ฝ ๐ต2 sin ๐ฝ ๐ฅ๐ฆ − ๐ง 2 ๐ฆ๐ง − ๐ฅ 2 ๐ง๐ฅ − ๐ฆ 2 ๐ถ1 sin3 ๐พ ๐ถ2 sin ๐พ 57 Mathematical (Semantic) Intellisense Prove (csc ๐ฅ − sin ๐ฅ)(sec ๐ฅ − cos ๐ฅ)(tan ๐ฅ + cot ๐ฅ) = 1 L.H.S. = 1 − sin ๐ฅ sin ๐ฅ = 1 − sin2 ๐ฅ sin ๐ฅ = cos 2 ๐ฅ sin ๐ฅ 1 − cos ๐ฅ cos ๐ฅ 1 − cos2 ๐ฅ cos ๐ฅ sin2 ๐ฅ cos ๐ฅ sin ๐ฅ cos ๐ฅ + cos ๐ฅ sin ๐ฅ sin2 ๐ฅ + cos 2 ๐ฅ cos ๐ฅ sin ๐ฅ 1 cos ๐ฅ sin ๐ฅ =1 58 Long-term Goals • Ultra-intelligent computer • Model of human mind • Inter-stellar travel ๏ 59