Programming in Your Favorite Language Lecture 5 2
























- Slides: 24
Programming in Your Favorite Language Lecture 5 -2 February 11 th, 1999 CS 250 Lecture 6 -2 CS 250: Intro to AI/Lisp
“Get Your Red-Hot Lists Here!” • Conses are pairs of pointers – First pointer is the car – Rest is the cdr • Lists are conses in which: – First pointer is the first element – Second pointer is the rest of the list – No intermediate pointers makes last expensive USER(104): (last (list 'a 'b 'c)) (C) Lecture 6 -2 CS 250: Intro to AI/Lisp
Box & Pointer • Represent a cons graphically (list ‘a (list ‘b ‘c) ‘d) Lecture 6 -2 CS 250: Intro to AI/Lisp
Some Things are More Equal than Others • Lisp has multiple definitions of equality • Decreasing order of strictness – eq, eql, equal Lecture 6 -2 CS 250: Intro to AI/Lisp
eq • True if its arguments are the same, identical object; otherwise, returns false (eq 'a 'b) => false (eq 'a 'a) => true (eq 3 3) => true OR => false (eq 3 3. 0) => false Lecture 6 -2 CS 250: Intro to AI/Lisp
eql • True of two objects, x and y, in the folowing cases: 1. If x and y are eq. 2. If x and y are both numbers of the same type and the same value. 3. If they are both characters that represent the same character. (eql (eql 'a 'b) => false 'a 'a) => true 3 3. 0) => false 3. 0) => true #c(3 -4)) => true #c(3 -4. 0) #c(3 -4)) => false Lecture 6 -2 CS 250: Intro to AI/Lisp
equal • Generally, returns true if two objects print the same > (setf x (cons ‘a nil)) (A) > (eql x x) T > (equal x (cons ‘a nil)) T Lecture 6 -2 CS 250: Intro to AI/Lisp
Mapping over lists • Need to do something to every element in a list? Try a mapping function: – mapcar for using the car of successive cdr’s – maplist for successive cdr’s themselves Lecture 6 -2 CS 250: Intro to AI/Lisp
mapcar in Action USER(115): (mapcar #'list '(a b c) '(1 2 3 4)) ((A 1) (B 2) (C 3)) USER(116): (mapcar #'list '(a b c) '(1 2)) ((A 1) (B 2)) Lecture 6 -2 CS 250: Intro to AI/Lisp
Creating an N-Queens Problem (defun nqueens-initial-state (n &optional (explicit? nil) (complete? nil)) (let ((s (make-CSP-state : unassigned (mapcar #'(lambda (var) (make-CSP-var : name var : domain (iota n))) (iota n)) : assigned nil : constraint-fn (if explicit? (let ((constraints (nqueens-constraints n))) #'(lambda (var 1 val 1 var 2 val 2) (CSP-explicit-check var 1 val 1 var 2 val 2 constraints))) #'nqueens-constraint-fn)))) (if complete? (CSP-random-completion s) s))) Lecture 6 -2 CS 250: Intro to AI/Lisp
Unassigned Variables (mapcar #'(lambda (var) (make-CSP-var : name var : domain (iota n))) (iota n)) USER(105): (iota 8) (0 1 2 3 4 5 6 7) Lecture 6 -2 CS 250: Intro to AI/Lisp
Unassigned Variables II ((0 (1 (2 (3 (4 (5 (6 (7 Lecture 6 -2 (0 (0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7) 7) CS 250: Intro to AI/Lisp NIL NIL NIL) NIL))
Recursion Again • Recursive function = Base case + Recursive step – Base case will be a conditional test, plus a call that returns • Example: General-Search (defun general-search-helper (problem nodes queuing-fn) (let ((node (first nodes))) (if (null node) nil : Lecture 6 -2 CS 250: Intro to AI/Lisp
Recursive General Search If we’ve got a node, what do we do next? (if (goal-test problem (node-state node)) node What if it’s not the goal? (general-search-helper problem (funcall queuing-fn (rest nodes) (expand node problem)) queuing-fn). . . ) Lecture 6 -2 CS 250: Intro to AI/Lisp
Put it Together (defun general-search-helper (problem nodes queuing-fn) (let ((node (first nodes))) (if (null node) nil (if (goal-test problem (node-state node)) node (general-search-helper problem (funcall queuing-fn (rest nodes) (expand node problem)) queuing-fn))))) Lecture 6 -2 CS 250: Intro to AI/Lisp
Getting it Started. . . From simple. lisp: General-Search function (let ((nodes (make-initial-queue problem queuing-fn)) node) How does Make-Initial-Queue work? (defun make-initial-queue (problem queuing-fn) (let ((q (make-empty-queue))) (funcall queuing-fn q (list (create-start-node problem))) q)) Lecture 6 -2 CS 250: Intro to AI/Lisp
Top-level Function (defun general-search-recursive (problem queueing-fn) "Recursive version of general search" (general-search-helper problem (list (create-start-node problem)) queueing-fn)) Lecture 6 -2 CS 250: Intro to AI/Lisp
BFS with a List What’s the rule for node exploration in BFS? How are new nodes added? (defun breadth-first-search (problem) (general-search-recursive problem #'append)) Lecture 6 -2 CS 250: Intro to AI/Lisp
Sets • Sets let you treat lists as sets – Membership – Union, intersection – Set difference Lecture 6 -2 CS 250: Intro to AI/Lisp
Sequences • Sequences include more than just lists – Ordered series – Lists and vectors • Many functions operate on sequences, not just lists: – length, sort, subseq, reverse, every, some, elt Lecture 6 -2 CS 250: Intro to AI/Lisp
Structures • Create records in Lisp • Define structures with the defstruct macro: (defstruct point x y) Lecture 6 -2 CS 250: Intro to AI/Lisp
“Big Sale on Constructors & Accessors!” • Creating a structure creates: – Constructor (make-point) • Arguments are passed by keyword – Copy constructor (copy-point) – Slot accessor functions (point-x, point -y) – Type predicate (point-p) • New structures are new types Lecture 6 -2 CS 250: Intro to AI/Lisp
Default Values for Structure Fields • Add a default value (defstruct midterm (difficulty (progn (format t “How hard was it? ”) (read))) (max-grade 54) (num-completed nil)) Lecture 6 -2 CS 250: Intro to AI/Lisp
Customize Automatic Functions (defstruct (point (: conc-name p) (: print-function print-point)) (x 0) (y 0)) (defun print-point (p stream depth) (format stream “#<~A, ~A>” (px p) (py p))) Lecture 6 -2 CS 250: Intro to AI/Lisp