Example of formula (defun roots (a b c) (list

Slides:



Advertisements
Similar presentations
CS 63 LISP Philip Greenspun's Tenth* Rule of Programming:
Advertisements

Lisp. Versions of LISP Lisp is an old language with many variants Lisp is alive and well today Most modern versions are based on Common Lisp LispWorks.
CSE 3341/655; Part 4 55 A functional program: Collection of functions A function just computes and returns a value No side-effects In fact: No program.
Getting started with ML ML is a functional programming language. ML is statically typed: The types of literals, values, expressions and functions in a.
Lisp II. How EQUAL could be defined (defun equal (x y) ; this is how equal could be defined (cond ((numberp x) (= x y)) ((atom x) (eq x y)) ((atom y)
Functional Programming. Pure Functional Programming Computation is largely performed by applying functions to values. The value of an expression depends.
1 Programming Languages and Paradigms Lisp Programming.
Lambda Calculus and Lisp PZ03J. Lambda Calculus The lambda calculus is a model for functional programming like Turing machines are models for imperative.
CS 355 – PROGRAMMING LANGUAGES Dr. X. Apply-to-all A functional form that takes a single function as a parameter and yields a list of values obtained.
1-1 An Introduction to Scheme March Introduction A mid-1970s dialect of LISP, designed to be a cleaner, more modern, and simpler version than.
Lisp – Introduction יעל נצר מערכות נבונות סמסטר ב' תשס"ו.
Lisp Recitation (cse471/598 Fall 2007 ) Aravind Kalavagattu.
ITERATIVE CONSTRUCTS: DOLIST Dolist is an iterative construct (a loop statement) consisting of a variable declaration and a body The body states what happens.
Lisp. Versions of LISP Lisp is an old language with many variants –LISP is an acronym for List Processing language Lisp is alive and well today Most modern.
First Lecture on Introductory Lisp Yun Peng. Why Lisp? Because it’s the most widely used AI programming language Because AI researchers and theoreticians.
Functional programming: LISP Originally developed for symbolic computing Main motivation: include recursion (see McCarthy biographical excerpt on web site).
CMSC 471 LISP. Why Lisp? Because it’s the most widely used AI programming language Because it’s good for writing production software (Graham article)
Introductory Lisp Programming Lecture # 2 Main Topics –Basic Lisp data types –Lisp primitives –Details of list handling Cons cells (boxes) & their representation.
Symbolic Expressions (S Expressions) Syntax: Opening and Closing parenthesis having elements in between. List represented in LISP: (A B2 C3 Shahid) (A.
Functional programming: LISP Originally developed for symbolic computing First interactive, interpreted language Dynamic typing: values have types, variables.
Rahman Lavaee Mashhadi Mohammad Shadravan. Conditional expressions LISP was the first language to contain a conditional expression In Fortran and Pascal.
LISP A brief overview. Lisp stands for “LISt Process” –Invented by John McCarthy (1958) –Simple data structure (atoms and lists) –Heavy use of recursion.
COMP 205 – Week 11 Dr. Chunbo Chu. Intro Lisp stands for “LISt Process” Invented by John McCarthy (1958) Simple data structure (atoms and lists) Heavy.
LISP 1.5 and beyond A very quick tour. Data Atoms (symbols) including numbers – All types of numbers including Roman! (well, in the early days) – Syntactically.
Basic Lisp CIS 479/579 Bruce R. Maxim UM-Dearborn.
For Monday Read Chapter 3 Homework: –Lisp handout 2.
1 Lisp Functions –Built-in functions –Defining functions –Function Evaluation and Special Forms defun, if Control statements –Conditional if, cond –Repetition.
CS 326 Programming Languages, Concepts and Implementation Instructor: Mircea Nicolescu Lecture 7.
The Loop Macro Many of the CL “functions” are actually macros (let, progn, if, etc) The most complicated macro in CL is probably the Loop macro –The Loop.
Basic LISP Programming Common LISP follows the algorithm below when interacting with users: loop read in an expression from the console; evaluate the expression;
Function Design in LISP. Program Files n LISP programs are plain text –DOS extensions vary; use.lsp for this course n (load “filename.lsp”) n Can use.
LISP Data Types Functional Programming Academic Year Alessandro Cimatti
Introduction to LISP. Lisp Extensible: It lets you define new operators yourself Lisp programs are expressed as lisp data structures –You can write programs.
UMBC CMSC Common Lisp II. UMBC CMSC Input and Output Print is the most primitive output function > (print (list 'foo 'bar)) (FOO BAR) The.
Milos Hauskrecht (PDF) Hieu D. Vu (PPT) LISP PROGARMMING LANGUAGE.
Functional Programming: Lisp MacLennan Chapter 10.
1 FP Foundations, Scheme In Text: Chapter Chapter 14: FP Foundations, Scheme Mathematical Functions Def: A mathematical function is a mapping of.
1 Vectors, binary search, and sorting. 2 We know about lists O(n) time to get the n-th item. Consecutive cons cell are not necessarily consecutive in.
1 Outline Review Introduction to LISP Symbols and Numbers Lists Writing LISP Functions LISPWorks.
Artificial Intelligence and Lisp Lecture 6 LiU Course TDDC65 Autumn Semester,
CS314 – Section 5 Recitation 10
Functional Programming Languages
Section 15.4, 15.6 plus other materials
ML: a quasi-functional language with strong typing
Modern Programming Languages Lecture 20 Fakhar Lodhi
CS 326 Programming Languages, Concepts and Implementation
Chapter 15 – Functional Programming Languages
LISP A brief overview.
Nondeterministic Evaluation
Using Lisp Lisp is a interactive system
First Lecture on Introductory Lisp
The Metacircular Evaluator
FP Foundations, Scheme In Text: Chapter 14.
Modern Programming Languages Lecture 21 Fakhar Lodhi
The Metacircular Evaluator
Lecture #8 מבוא מורחב.
Modern Programming Languages Lecture 20 Fakhar Lodhi
The Metacircular Evaluator (Continued)
LISP A brief overview.
John McCarthy Pioneer in AI Also Lisp Formalize common-sense reasoning
Announcements Quiz 5 HW6 due October 23
Abstraction and Repetition
Functional Programming: Lisp
6.001 SICP Interpretation Parts of an interpreter
Modern Programming Languages Lecture 18 Fakhar Lodhi
Common Lisp II.
Lisp.
More Scheme CS 331.
The general format of case is the following: (case <key form>
LISP primitives on sequences
Presentation transcript:

Example of formula (defun roots (a b c) (list (/ (+ (- b) (sqrt (- (expt b 2) (* 4 a c)) )) (* 2 a)) (* 2 a)) )) Returns a list of solutions to a quadratic equation

For every quote there is an eval eval and quote > (eval (cdr '(a + 2 3))) 5 > (setq a 'b) b > a > b error: unbound variable - b if continued: try evaluating symbol again 1> [ back to top level ] > (set 'a 'b) > (eval (eval ''a)) > 'a a Value of atom a is atom b For every quote there is an eval

For every quote there is an eval eval and quote For every quote there is an eval > (eval (eval '(quote a))) b > 'a a > (eval '(list '* 9 6)) (* 9 6) > (eval (eval '(list * 9 6))) error: bad function - (* 9 6) 1> [ back to top level ] > (eval (eval '(list '* 9 6))) 54

Examples of tail recursion If last operation in function is recursive call, overwrite actuals and go to beginning of code: (defun last (lis) ; finds the last element of the list (if (null? (cdr lis) (car lis)) (last (crd lis)))) ; can be done with loop (defun length (lis) ; calculates the length of the list (if (null? lis) 0) (+ 1 (length (cdr lis)))) ; not tail recursive!

Example of Tree Recursion: Fibonacci Writing a function to compute the nth Fibonacci number Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, … fib(0) = 0 fib(1) = 1 fib(n) = fib(n-2) + fib(n-1)

Short Version of tree recursion (defun fib (n) (cond ((eql n 0) 0) ; base case ((eql n 1) 1) ; base case (t (+ (fib (- n 1)) ; recursively compute fib(n) (fib (- n 2))))))

Complete Version with Error Checking and Comments (defun fib (n) "Computes the nth Fibonacci number." (cond ((or (not (integerp n)) (< n 0)) ; error case (error "~s must be an integer >= 0.~&" n)) ((eql n 0) 0) ; base case ((eql n 1) 1) ; base case (t (+ (fib (- n 1)) ; recursively compute fib(n) (fib (- n 2))))))

Problems: 1. Write a function (power 3 2) = 3^2 = 9 2. Write a function that counts the number of atoms in an expression. (count-atoms '(a (b) c)) --> 3 3. (count-anywhere 'a '(a ((a) b) a)) --> 3 4. (dot-product '(10 20) '(3 4)) --> 10x3 + 20x4 = 110 5. Write a function (flatten '(a (b) () ((c)))) --> (a b c) which removes all levels of parenthesis and returns a flat list of atoms. 6. Write a function (remove-dups '(a 1 1 a b 2 b)) --> (a 1 b 2) which removes all duplicate atoms from a flat list. (Note: there is a built-in remove-duplicates in Common Lisp, do not use it).

Solutions 1-3 (defun power (a b) "compute a^b - (power 3 2) ==> 9" (if (= b 0) 1 (* a (power a (- b 1))))) (defun count-atoms (exp) "count atoms in expresion - (count-atoms '(a (b) c)) ==> 3" (cond ((null exp) 0) ((atom exp) 1) (t (+ (count-atoms (first exp)) (count-atoms (rest exp)))))) (defun count-anywhere (a exp) "count performances of a in expresion - (count-anywhere 'a '(a ((a) b) (a))) ==> 3" ((atom exp) (if (eq a exp) 1 0)) (t (+ (count-anywhere a (first exp)) (count-anywhere a (rest exp))))))

Solutions (defun flatten (exp) "removes all levels of paranthesis and returns flat list of atomsi (flatten '(a (b) () ((c)))) ==> (a b c)" (cond ((null exp) nil) ((atom exp) (list exp)) (t (append (flatten (first exp)) (flatten (rest exp))))))

Iteration – adding all elements from a list Iteration is done by recursion Analogous to while-loop (defun plus-red (a) (if (null a) 0 (plus (car a) (plus-red (cdr a)) )) )

Nested Loops Example : Cartesian product (defun all-pairs (M N) (if (null M) nil (append (distl (car M) N) (all-pairs (cdr M ) N )) )) (defun distl (x N) (if (null N) nil (cons (list x (car N)) (distl x (cdr N)) )) )

Functional arguments and abstraction Suppress details of loop control and recursion example: applying a function to all elements of list (defun mapcar (f x) (if (null x) nil (cons (f (car x)) (mapcar f (cdr x)) )) ) Another definition of mapcar uses if not cond

Hierarchical structures Are difficult to handle iteratively example: equal function eq only handles atoms initial states If x and y are both atoms (equal x y) = (eq x y) If exactly one of x and y is atom (equal x y) = nil (and (atom x) (atom y) (eq x y)) use car and cdr to write equal recursively

Equivalency of recursion and iteration it may be seemed that recursion is more powerful than iteration in theory these are equivalent As we said iteration can be done by recursion by maintaining a stack of activation records we can convert a recursive program to an iterative one.

Genetic algorithm Common Lisp code

REDUCE (with 3 arguments) a function to be applied to every element of list x Final value returned (defun reduce (f a x) (if (null x) a (f (car x) (reduce f a (cdr x) )) ) ) a list (reduce #'* '(1 2 3 4 5)) => 120 Here only two values (* 1 (* 2 (* 3 (* 4 5)))) => 120

Few more examples of using function reduce (reduce #'append '((1) (2)) :initial-value '(i n i t) ) => (I N I T 1 2) ;; list (I N I T) with appended (1) with appended (2) (reduce #'append '((1) (2)) :from-end t :initial-value '(i n i t)) => (1 2 I N I T) (reduce #'- '(1 2 3 4)) == (- (- (- 1 2) 3) 4) => -8 (reduce #'- '(1 2 3 4) :from-end t) ;Alternating sum. == (- 1 (- 2 (- 3 4))) => -2 (reduce #'+ '()) => 0 (reduce #'+ '(3)) => 3 (reduce #'+ '(foo)) => FOO

Few more examples of using function reduce (reduce #'+ '(foo)) => FOO (reduce #'list '(1 2 3 4)) => (((1 2) 3) 4) ;; assumes to start from beginning of argument list (list (list (list 1 2) 3) 4) (reduce #'list '(1 2 3 4) :from-end t) => (1 (2 (3 4))) (reduce #'list '(1 2 3 4) :initial-value 'foo) => ((((foo 1) 2) 3) 4) (reduce #'list '(1 2 3 4) :from-end t :initial-value 'foo) => (1 (2 (3 (4 foo))))

Few more functions reduce reduce uses a binary operation, function, to combine the elements of sequence bounded by start and end. The function must accept as arguments two elements of sequence or the results from combining those elements. The function must also be able to accept no arguments. If key is supplied, it is used is used to extract the values to reduce. The key function is applied exactly once to each element of sequence in the order implied by the reduction order but not to the value of initial-value, if supplied. The key function typically returns part of the element of sequence. If key is not supplied or is nil, the sequence element itself is used. The reduction is left-associative, unless from-end is true in which case it is right-associative. If initial-value is supplied, it is logically placed before the subsequence (or after it if from-end is true) and included in the reduction operation. In the normal case, the result of reduce is the combined result of function's being applied to successive pairs of elements of sequence. If the subsequence contains exactly one element and no initial-value is given, then that element is returned and function is not called. If the subsequence is empty and an initial-value is given, then the initial-value is returned and function is not called. If the subsequence is empty and no initial-value is given, then the function is called with zero arguments, and reduce returns whatever function does. This is the only case where the function is called with other than two arguments.

Few more examples of function some SOME function searches the sequences for values for which predicate returns true. It there is such list of values that occupy same index in each sequence, return value is true, otherwise false. (some #'alphanumericp "") => NIL (some #'alphanumericp "...") => NIL (some #'alphanumericp "ab...") => T (some #'alphanumericp "abc") => T (some #'< '(1 2 3 4) '(2 3 4 5)) => T (some #'< '(1 2 3 4) '(1 3 4 5)) => T (some #'< '(1 2 3 4) '(1 2 3 4)) => NIL

Reminder of function let* let* is similar to let, but the bindings of variables are performed sequentially rather than in parallel. The expression for the init-form of a var can refer to vars previously bound in the let*. The form (let* ((var1 init-form-1) (var2 init-form-2) ... (varm init-form-m)) declaration1 declaration2 declarationp form1 form2 formn) first evaluates the expression init-form-1, then binds the variable var1 to that value; then it evaluates init-form-2 and binds var2, and so on. The expressions formj are then evaluated in order; the values of all but the last are discarded (that is, the body of let* is an implicit progn).

User defined function for crossover (random 1.0) generates a random number between 0.0 and 1.0 x and y are chromosomes. This function does “in place” crossover or leaves parents unchanged as they are (defun crossover (x y)    (if (> (random 1.0) 0.6) (list x y)  ;; in this case do nothing, return x and y as in input     ;;else      (let* ((site (random (length x)))      (swap (rest (nthcdr site x) )))        (setf (rest (nthcdr site x)) (rest (nthcdr site y)))        (setf (rest (nthcdr site y)) swap)))) Site is a place of cut Creates child 1 Swap is temporary location Execute crossover X Y Creates child 2 (nthcdr 2 x) x site swap swap Child 1 Child 2

User defined function for mutation Genotype = chromosome = (1 0 1 1 1 0 0 1 1 0 1 0 1 1 0) genotype X 1 1 1 genotype X Mapcar moves X through the genotype (defun mutate (genotype)    (mapcar #'(lambda (x)          (if (> (random 1.0) 0.03) x ;; if random number is larger than 0.03 do nothing             ;; else             (if (= x 1) 0                ;; else                1)))     genotype)) Does mutation of a single genotype by flipping bits 1--> 0, 0 --> 1 Can do several mutations at once

User defined function selectone distribution …. 1 Genotypen pair cost1 cost3 costn Genotype1 Genotype3 This function takes distribution and selects one candidate. It will be used in function reproduce Genotype and distribution are lists of pairs ((cost chromosome) … (cost chromosome)) Selects one parent from population (defun selectone (distribution)    (let ((random (random 1.0))           (prob 0)          genotype)      (some #'(lambda (pair)         (incf prob (first pair))         (if (> random prob) nil             ;;else             (setq genotype (rest pair))))         distribution)       (mutate genotype))) Initializes random Initializes prob Initializes genotype Compares elements of distribution. Selects one with higher prob Some selects the first from left that has higher value of prob Apply to the original distribution Calls function mutate to mutate the genotype

Calculate fitness function Function fitness calculates fitness of a chromosome x (genotype, object, candidate) x Function list2num converts list of binary bits s to a number (defun fitness (x)    (let ((xarg (/ (list2num x) 1073741823.0))          (v '(0.5 0.25 1.0 0.25))          (c '(0.125 0.375 0.625 0.875))          (w 0.003))      (reduce #'+ (mapcar #'(lambda (vi ci)         (let ((xc (- xarg ci)))           (* vi (exp (* -1 (/ (* 2 w)) xc xc)))))          v c)))) Calculates fitness of a genotype x Set parameters This is of course just one particular example of calculating the cost fitness function. You create your own fitness function for your problem. Chromosome is now a single number xarg i=4 -2w  ( ( e 2 Fitness = (xarg-ci) vi * REMINDER (reduce #'* '(1 2 3 4 5)) => 120 i=1

User defined function distribution Takes the initial population and distributes it according to fitness function Distributes initial population (defun distribution (population)    (let* ((genotypes (remove-duplicates population :test #'equal))    (sum (apply #'+ (mapcar #'fitness genotypes))))      (mapcar #'(lambda (x) (cons (/ (fitness x) sum) x)) genotypes))) Creates genotypes by removing the duplicates from population Uses function fitness Creates sum of fitness values Calculates fitness of all elements from list genotypes Creates a pair of normalized fitness and a genotype x Creates list of pairs for all elements of list genotypes

Genetic algorithm Common Lisp code (importance of drawing trees for larger functions) reproduce offspring distribution dotimes let length selectone setq crossover nconc I found it very useful to create for myself such trees to know who is calling whom

Genetic algorithm Common Lisp code: Takes population as argument. This can be some list of random binary lists of the same length each. (defun reproduce (population) (let ( (offspring nil) (d (distribution population) )) (dotimes (i (/ (length population) 2) ) (let ( (x (selectone d) ) (y (selectone d)) ) (crossover x y) (setq offspring (nconc (list x y) offspring) ) )) offspring)) Initializes offspring to empty list Distributed population Distributes initial population Repeats for the length of half population Selects parent x, one from population Selects parent y, one from population Does crossover of parents x and y End of adding new children to list offspring Creates new list offspring by adding new children x and y to old list offspring Returns new list offspring

Building Problem Solvers in LISP http://www.qrg.northwestern.edu/bps/directory.html

Problems for homework Using the example of genetic algorithm above write your own program in LISP to use genetic algorithm in order to find a single solution x to equation 3x5+ 7x4+5x=8 2. Using the example of genetic algorithm above write your own program in LISP to use genetic algorithm in order to find the shortest path in a graph from node S to node F. 2 S A 2 1 2 2 C 2 1 1 B V 3 R 2 F 3 3 D 2 1 2 N Q 2