320 likes | 437 Vues
This comprehensive guide explores the art of logic programming, emphasizing control structures and backtracking techniques. It discusses the fundamental concepts of logic programming, including variable management, problem solving, and recursive algorithms. Key examples illustrate how to utilize backtracking for returning solutions and handle infinite lists through streams. The content is designed for those looking to enhance their programming skills and understand the intricacies of controlling program flow and managing complex logical relationships.
E N D
Contents • Logic Programming • sans Control • with Backtracking • Streams
Example • (append empty x x) ← • (append (cons w x) y (cons w z)) ← (append x y z) • (append q r (cons 1 (cons 2 empty))) • Unify: (append empty x x) • { q |→ empty, r |→ (cons 1 (cons 2 empty))
Example • (append empty x x) ← • (append (cons w x) y (cons w z)) ← (append x y z) • (append q r (cons 1 (cons 2 empty))) • Unify: (append (cons w x) y (cons w z)) • (append x r (cons 2 empty))
Example • (append empty x x) ← • (append (cons w x) y (cons w z)) ← (append x y z) • (append x r (cons 2 empty)) • Unify: (append empty x x) • { x |→ empty, r |→ (cons 2 empty) }
Example • (append empty x x) ← • (append (cons w x) y (cons w z)) ← (append x y z) • (append x r (cons 2 empty)) • Unify: (append (cons w x) y (cons w z)) • (append x r empty)
Example • (append empty x x) ← • (append (cons w x) y (cons w z)) ← (append x y z) • (append x r empty) • Unify: (append empty x x) • { x |→ empty, r |→ empty }
Example • (append empty x x) ← • (append (cons w x) y (cons w z)) ← (append x y z) • (append x r empty) • !Unify: (append (cons w x) y (cons w z))
Logic Programming • solve • Input: List of Goals • KB: List of Rules • Output: List of mappings • Problem: • Keeping variables straight
Logic Programming • Keeping variables straight • Variable renaming • Replace: • (append empty x x) ← • With: • (append empty v0 v0) ← • Instantiate as needed
Logic Programming (define solve (lambda (goals) (if (null? goals) <then-expression> <else-expression>)))
Logic Programming (define solve (lambda (goals) (if (null? goals) <found a solution> <try to find rule for first goal>))) • Fake Problem • Output solution when found
Logic Programming (define solve (lambda (goals soln) (if (null? goals) (add-to-answer soln) <try to find all rules for first goal>)))
Logic Programming (define solve (lambda (goals soln) (if (null? goals) (add-to-answer soln) (for-each (lambda (x) (let ((u (unify (car goals) (head x)))) (if u <call to solve>)))))))
Logic Programming (define solve (lambda (goals soln) (if (null? goals) (add-to-answer soln) (for-each (lambda (x) (let ((u (unify (car goals) (head x)))) (if u (solve (append (cdr goals) (inst (tail x) u)) (append soln u)))))))))
Backtracking • Problem • Want to return solution
Backtracking • Problem • Want to return solution (define solve (lambda (goals soln k) (if (null? goals) (k soln) …)))
Backtracking • Problem • Want to return solution *and be able to continue* (define solve (lambda (goals soln k) (if (null? goals) (backtrack k soln) …)))
Backtracking • Problem • Want to return solution *and be able to continue* (define backtrack (lambda (k soln) (call-with-current-continuation (lambda (x) …))))
Backtracking • Problem • Want to return solution *and be able to continue* (define backtrack (lambda (k soln) (call-with-current-continuation (lambda (x) (k (cons soln x))))))
Backtracking • Problem • Want to return solution, be able to continue *and return other solutions* • Current “solution” will use the old continuation to return answers
Backtracking (define solve-k (lambda (x) x)) (define solve (lambda (goals soln) (if (null? goals) (backtrack soln) …))) (define backtrack (lambda (soln) (call-with-current-continuation (lambda (x) (solve-k (cons soln x))))))
Backtracking • Problem • Need to return 0 argument function • When executed, function should get the current-continuation (for return continuation) • Must be able to overwrite old return continuation
Backtracking (define backtrack (lambda (soln) (set! solve-k (call-with-current-continuation (lambda (x) …)))))
Backtracking (define backtrack (lambda (soln) (set! solve-k (call-with-current-continuation (lambda (x) (solve-k (cons soln …)))))))
Backtracking (define backtrack (lambda (soln) (set! solve-k (call-with-current-continuation (lambda (x) (solve-k (cons soln (lambda () (call-with-current-continuation (lambda (y) (x y)))))))))))
Backtracking • Want to return answer ASAP • Pass your answer forward • Need return continuation • Will need to be changed with every continue • Make it global • Remember to return continuation • (cons <answer> <continue>)
Backtracking • Book • Control entirely handled by continuations • This • Mixed control: Backtracking handled by continuations, function control flow handled by Scheme call stack
Backtracking • Book • sk (success continuation) is solve-k • What to do with answers • fk (failure continuation) has no direct equivalent • Essentially says, here’s what to do next • Is related to for-each statements in code
Streams • Infinite Lists • (define x (cons 1 1)) • (set-cdr! x x) • (eq? x (cdr x)) → #t • (car x) → 1
Streams • Infinite List • Consecutive numbers • Primes • Digits of pi • Random numbers
Streams • stream = (cons <value> <func:→ stream>) • Very similar to backtracking returns • (car x) = (car x) • (cdr x) = ((cdr x))