Combining Lists & Built-in Predicates

Similar documents
Snakes. Declarative Languages. Relation different. Overview. Negation as failure. Relation different

Lecture 9: A closer look at terms

Lecture 9. Exercises. Theory. Solutions to exercises LPN 8.1 & 8.2. Patrick Blackburn, Johan Bos & Kristina Striegnitz

Recursion, Structures, and Lists

3 Lists. List Operations (I)

What s the problem? fib(1,1). fib(2,1). fib(n,x) :- N>2, N1 is N-1, N2 is N-2, fib(n1,x2), fib(n2,x2).

The object level in Prolog. Meta-level predicates and operators. Contents. The flow of computation. The meta level in Prolog

COP4020 Programming Languages. Logical programming with Prolog Prof. Xin Yuan

Chapter 6. Predefined Predicates

Research Report AI A Numerical Equation Solver in Prolog Michael A. Covington Artificial Intelligence Programs The University of Georgia

Prolog. the structure Ref: Learn Prolog Now! On line Prolog Documentation. Blackburn, Bos, Striegnitz.

Programming Languages

More Planning and Prolog Operators

Advanced Prolog Programming

Lecture 6: More Lists

Logic Programming. Efficiency Issues. Temur Kutsia

Overview. Declarative Languages. operation of del. Deleting an element from a list. functions using del. inserting elements with del

Topic B: Backtracking and Lists

Arithmetic Terms are Symbolic

Tests, Backtracking, and Recursion

Example Programming Exercises for Prolog

Difference lists in Prolog

Symbolic Computation Example Programming Exercises for Prolog

CSC384: Intro to Artificial Intelligence Prolog Tutorials 3&4. Hojjat Ghaderi, Fall 2006, University of Toronto

INTRODUCTION TO PROLOG

Chapter 16. Logic Programming. Topics. Predicate Calculus and Proving Theorems. Resolution. Resolution: example. Unification and Instantiation

Computational Logic The (ISO-)Prolog Programming Language

Introduction. CSc 372. Comparative Programming Languages. 22 : Prolog Lists. Department of Computer Science University of Arizona.

This lecture covers: Prolog s execution strategy explained more precisely. Revision of the elementary Prolog data types

Prolog (cont d) Remark. Using multiple clauses. Intelligent Systems and HCI D7023E

Introduction. chapter Functions

York University CSE 3401 Vida Movahedi. York University CSE 3401 V. Movahedi 09_ExamplePrograms

Exercises on the Fundamentals of Prolog

CSC324 Logic & Relational Programming Illustrated in Prolog

Lecture 21: Relational Programming II. November 15th, 2011

Lecture 11: Feb. 10, 2016

Lecture 16: Logic Programming in Prolog

Prolog Introduction. Gunnar Gotshalks PI-1

AstLog. Outline. Microsoft Research.

PROgramming in LOGic PROLOG Recursion, Lists & Predicates

Programming Paradigms

Building a system for symbolic differentiation

Repetition Structures

Condition-Controlled Loop. Condition-Controlled Loop. If Statement. Various Forms. Conditional-Controlled Loop. Loop Caution.

10. Logic Programming With Prolog

Operators (2A) Young Won Lim 10/5/13

Map coloring example

Prolog - 3 Prolog search trees + traces

a little more on macros sort of like functions, but..

Operators (2A) Young Won Lim 10/2/13

Introduction to Prolog

Information technology Programming languages Prolog Part 1: General core

An introduction to Prolog. P. Cabalar ( Department Prolog of Computer Science University of Corunna, FebruarySPAIN 8, 2016)

Derived from PROgramming in LOGic (1972) Prolog and LISP - two most popular AI languages. Prolog programs based on predicate logic using Horn clauses

CAP 5602 Summer, Lesson 4: Loops. The topics 1. the cut and some of its uses 2. the while loop 3. the do until loop

Hints: I used a left fold and wrote a named helper function when I created my solution.

LISP. Everything in a computer is a string of binary digits, ones and zeros, which everyone calls bits.

Implementação de Linguagens 2016/2017

Building a system for symbolic differentiation

Part I Logic programming paradigm

A Small Interpreted Language

Notes on Higher Order Programming in Scheme. by Alexander Stepanov

The Prolog to Mercury transition guide

Wan Hussain Wan Ishak

Modern Programming Languages. Lecture LISP Programming Language An Introduction

Page 1 of 5. University of Toronto CSC326 Programming Languages, Fall 2009

Prolog Assessed Exercise

Bachelor/Master Exam Version V3B

Logic Programming (PLP 11) Prolog: Arithmetic, Equalities, Operators, I/O, Natural Language Parsing

simplicity hides complexity flow of control, negation, cut, 2 nd order programming, tail recursion procedural and declarative semantics and & or

CS 360: Programming Language Concepts Lecture 15 Logic Programming

MORE RECURSIVE FUNCTIONS

Introduction to Scheme

Scheme: Strings Scheme: I/O

Logic Programming. April 3, 2017

Introduction to Prolog by

Introduction to Erlang. Franck Petit / Sebastien Tixeuil

Prolog. Intro to Logic Programming

Scheme Tutorial. Introduction. The Structure of Scheme Programs. Syntax

ARM Evaluation System

simplicity hides complexity flow of control, negation, cut, 2 nd order programming, tail recursion procedural and declarative semantics and & or

CSCI337 Organisation of Programming Languages LISP

School of Computer Science

The current topic: Prolog. Announcements. Meaning of a Prolog rule. Prolog syntax. Reminder: The deadline for Lab 2 re-mark requests is Friday.

Prolog-2 nd Lecture. Prolog Predicate - Box Model

The Idea Underlying Logic Programming. CSci 8980, Fall 2012 Specifying and Reasoning About Computational Systems An Introduction to Logic Programming

Chapter 5. Pure PROLOG. Foundations of Logic Programming

Programming Languages

Logic Programming. Manipulating Programs. Temur Kutsia

First-Order Logic (FOL)

IKI30820 Logic Programming Programming Style and Techniques Slide 09

Principles of Programming Languages Topic: Scope and Memory Professor Louis Steinberg Fall 2004

Programming Paradigms

Haskell: Lists. CS F331 Programming Languages CSCE A331 Programming Language Concepts Lecture Slides Friday, February 24, Glenn G.

Logic Programming (PLP 11) Prolog Imperative Control Flow: Backtracking, Cut, Fail, Not

Announcements. The current topic: Scheme. Review: BST functions. Review: Representing trees in Scheme. Reminder: Lab 2 is due on Monday at 10:30 am.

Logic Programming Languages

1.3. Conditional expressions To express case distinctions like

Logical reasoning systems

Laboratory 5: Implementing Loops and Loop Control Strategies

Transcription:

Combining Lists & Built-in Predicates Artificial Intelligence Programming in Prolog Lecturer: Tim Smith Lecture 6 11/10/04 11/10/04 AIPP Lecture 6: Built-in Predicates 1

Collecting Results Last time we discussed three methods of collecting results: 1. Compute result at base case first, then use this result as you backtrack through the program. 2. Accumulate a result as you recurse into the program and finalise it at the base case. 3. Recurse on an uninstantiated variable and accumulate results on backtracking. Today we will look how you can use an accumulator during recursion and backtracking to combine lists.?- L1=[a,b], L2=[c,d], Z=[L1 L2]. L1 = [a,b], L2 = [c,d], Z = [[a,b],c,d]? 11/10/04 AIPP Lecture 6: Built-in Predicates 2

Constructing a list during Recursion?- pred([a,b],[c,d],out). Out = [a,b,c,d]. Desired behaviour To add L1 to L2 during recursion we can use the bar notation to decompose L1 and add the Head to L2. pred([h T],L2,Out):- pred(t,[h L2],Out). Accumulator We need to have an extra variable (Out) which can be used to pass back the new list once L1 is empty. pred([],l2,l2). base case: when L1 is empty make the new list equal to the Output list. The base case must go before the recursive case. 11/10/04 AIPP Lecture 6: Built-in Predicates 3

Constructing a list during Recursion (2)?- pred([a,b],[c,d],out). 1 1 Call: pred([a,b],[c,d],_515)? 2 2 Call: pred([b],[a,c,d],_515)? 3 3 Call: pred([],[b,a,c,d],_515)? 3 3 Exit: pred([],[b,a,c,d],[b,a,c,d])? 2 2 Exit: pred([b],[a,c,d],[b,a,c,d])? 1 1 Exit: pred([a,b],[c,d],[b,a,c,d])? Out = [b,a,c,d]? Always the same variable pred([],l2,l2). pred([h T],L2,Out):- pred(t,[h L2],Out). If you construct a list through recursion (on the way down) and then pass the answer back the elements will be in reverse order. 11/10/04 AIPP Lecture 6: Built-in Predicates 4

reverse/3?- pred([a,b],[c,d],out). 1 1 Call: pred([a,b],[c,d],_515)? 2 2 Call: pred([b],[a,c,d],_515)? 3 3 Call: pred([],[b,a,c,d],_515)? 3 3 Exit: pred([],[b,a,c,d],[b,a,c,d])? 2 2 Exit: pred([b],[a,c,d],[b,a,c,d])? 1 1 Exit: pred([a,b],[c,d],[b,a,c,d])? Out = [b,a,c,d]? reverse([],l2,l2). reverse([h T],L2,Out):- reverse(t,[h L2],Out). If you construct a list through recursion (on the way down) and then pass the answer back the elements will be in reverse order. 11/10/04 AIPP Lecture 6: Built-in Predicates 5

Constructing a list in backtracking To maintain the order of list elements we need to construct the list on the way out of the program, i.e. through backtracking. Use the same bar deconstruction as before but add the head element of L1 to Out in the Head of the clause. pred([h T],L2,[H Out]):- pred(t,l2,out). Head is not added until backtracking. Now when we reach the base case we make L2 the foundation for the new Out list and add our L1 elements to it during backtracking. pred([],l2,l2). base case: when L1 is empty make the new list equal to the Output list. 11/10/04 AIPP Lecture 6: Built-in Predicates 6

append/3?- pred2([a,b],[c,d],out). 1 1 Call: pred2([a,b],[c,d],_515)? 2 2 Call: pred2([b],[c,d],_1131)? 3 3 Call: pred2([],[c,d],_1702)? 3 3 Exit: pred2([],[c,d],[c,d])? 2 2 Exit: pred2([b],[c,d],[b,c,d])? 1 1 Exit: pred2([a,b],[c,d],[a,b,c,d])? Out = [a,b,c,d]? append([],l2,l2). append([h T],L2,[H Rest]):- append(t,l2,rest). Variable changes at every Call. * append/3 is another very common user-defined list processing predicate. 11/10/04 AIPP Lecture 6: Built-in Predicates 7

Computing in reverse Both reverse/3 and append/3 can be used backwards to make two lists out of one. This can be a useful way to strip lists apart and check their contents.?- append(x,y,[a,b,c,d]). X = [], Y = [a,b,c,d]? ; X = [a], Y = [b,c,d]? ; X = [a,b], Y = [c,d]? ; X = [a,b,c], Y = [d]? ; X = [a,b,c,d], Y = []? ; no append([],l2,l2). append([h T],L2,[H Rest]):- append(t,l2,rest).?-append(x,[c,d],[a,b,c,d]). X = [a,b]? 11/10/04 AIPP Lecture 6: Built-in Predicates 8

Computing in reverse Both reverse/3 and append/3 can be used backwards to make two lists out of one. This can be a useful way to strip lists apart and check their contents.?- reverse(x,y,[a,b,c,d]). X = [], Y = [a,b,c,d]? ; X = [a], Y = [b,c,d]? ; reverse([],l2,l2). X = [b,a], Y = [c,d]? ; reverse([h T],L2,Out):- X = [c,b,a], Y = [d]? ; reverse(t,[h L2],Out). X = [d,c,b,a], Y = []? ; *loop*?-reverse([d,c,b,a],y,[a,b,c,d]). Y = []? 11/10/04 AIPP Lecture 6: Built-in Predicates 9

Built-in Predicates var/1 nonvar/1 atom/1 atomic/1 number/1 integer/1 float/1 compound/1 ground/1 =../2 functor/3 arg/3 findall/3 setof/3 bagof/3 Identifying terms Decomposing structures Collecting all solutions 11/10/04 AIPP Lecture 6: Built-in Predicates 10

Identifying Terms These built-in predicates allow the type of terms to be tested. var(x) succeeds if X is currently an uninstantiated variable. nonvar(x) succeeds if X is not a variable, or already instantiated atom(x) is true if X currently stands for an atom number(x) is true if X currently stands for a number integer(x) is true if X currently stands for an integer float(x) is true if X currently stands for a real number. atomic(x) is true if X currently stands for a number or an atom. compound(x)is true if X currently stands for a structure. ground(x) succeeds if X does not contain any uninstantiated variables. 11/10/04 AIPP Lecture 6: Built-in Predicates 11

var(x) succeeds if X is currently an uninstantiated variable.?- var(x).?- X = 5, var(x).?- var([x]). true? no no nonvar(x) var/1, nonvar/1, atom/1 Conversely, nonvar/1 succeeds if X is not a variable, or already instantiated.?- nonvar(x).?- X = 5,nonvar(X).?-nonvar([X]). no X = 5? true? atom(x) is true if X currently stands for an atom: a nonvariable term with 0 arguments, and not a number?- atom(paul).?- X = paul,atom(x).?- atom([]). X = paul??-atom([a,b]). no 11/10/04 AIPP Lecture 6: Built-in Predicates 12

number/1, integer/1, float/1 number(x) is true if X currently stands for any number?- number(x).?- X=5,number(X).?- number(5.46). no X = 5? To identify what type of number it is use: integer(x) is true if X currently stands for an integer (a whole positive or negative number or zero). float(x) is true if X currently stands for a real number.?- integer(5).?- integer(5.46). no?- float(5).?- float(5.46). no 11/10/04 AIPP Lecture 6: Built-in Predicates 13

atomic/1, compound/1, ground/1 If atom/1 is too specific then you can use atomic/1 which accepts numbers and atoms.?- atom(5).?- atomic(5). no If atomic/1 fails then the term is either an uninstantiated variable (which you can test with var/1) or a compound term:?-compound([]).?-compound([a]).?-compound(b(a)). no ground(x) succeeds if X does not contain any uninstantiated variables. Also checks inside compound terms.?-ground(x).?-ground(a(b,x)). no?-ground(a). no?-ground([a,b,c]). 11/10/04 AIPP Lecture 6: Built-in Predicates 14

Decomposing Structures When using compound structures you can t use a variable to check or make a functor.?- X=tree, Y = X(maple). Syntax error Y=X<<here>>(maple) functor(t,f,n) arg(n,term,a) is true if F is the principal functor of T and N is the arity of F. is true if A is the Nth argument in Term.?-functor(t(f(X),a,T),Func,N).?-arg(2,t(t(X),[]),A). N = 3, Func = t? A = []??- functor(d,date,3), arg(1,d,11), arg(2,d,oct), arg(3,d,2004). D = date(11,oct,2004)? 11/10/04 AIPP Lecture 6: Built-in Predicates 15

Decomposing Structures (2) We can also decompose a structure into a list of its components using =../2. Term =.. L is true if L is a list that contains the principal functor of Term, followed by its arguments.?- f(a,b) =.. L.?- T =.. [is_blue,sam,today]. L = [f,a,b]? T = is_blue(sam,today)? By representing the components of a structure as a list they can be recursively processed without knowing the functor name.?- f(2,3)=..[f,n Y], N1 is N*3, L=..[F,N1 Y]. L = f(6,3)? 11/10/04 AIPP Lecture 6: Built-in Predicates 16

Collecting all solutions You've seen how to generate all of the solutions to a given goal, at the SICStus prompt (;):?- member(x, [1,2,3,4]). X = 1? ; X = 2? ; X = 3? ; X = 4? ; no It would be nice if we could generate all of the solutions to some goal within a program. There are three similar built-in predicates for doing this: findall/3 setof/3 bagof/3 11/10/04 AIPP Lecture 6: Built-in Predicates 17

Meta-predicates findall/3, setof/3, and bagof/3 are all meta-predicates they manipulate Prolog s proof strategy. findall(x,p,l) setof(x,p,l) bagof(x,p,l) All produce a list L of all the objects X such that goal P is satisfied (e.g. age(x,age)). They all repeatedly call the goal P, instantiating the variable X within P and adding it to the list L. They succeed when there are no more solutions. Exactly simulate the repeated use of ; at the SICStus prompt to find all of the solutions. 11/10/04 AIPP Lecture 6: Built-in Predicates 18

findall/3 findall/3 is the most straightforward of the three, and the most commonly used:?- findall(x, member(x, [1,2,3,4]), Results). Results = [1,2,3,4] This reads: `find all of the Xs, such that X is a member of the list [1,2,3,4] and put the list of results in Results'. Solutions are listed in the result in the same order in which Prolog finds them. If there are duplicated solutions, all are included. If there are infinitely-many solutions, it will never terminate! 11/10/04 AIPP Lecture 6: Built-in Predicates 19

findall/3 (2) We can use findall/3 in more sophisticated ways. The second argument, which is the goal, might be a compound goal:?- findall(x, (member(x, [1,2,3,4]), X > 2), Results). Results = [3,4]? The first argument can be a term of any complexity:?- findall(x/y, (member(x,[1,2,3,4]), Y is X * X), Results). Results = [1/1, 2/4, 3/9, 4/16]? 11/10/04 AIPP Lecture 6: Built-in Predicates 20

setof/3 setof/3 works very much like findall/3, except that: It produces the set of all results, with any duplicates removed, and the results sorted. If any variables are used in the goal, which do not appear in the first argument, setof/3 will return a separate result for each possible instantiation of that variable: age(peter, 7). age(ann, 5). age(pat, 8). age(tom, 5). age(ann, 5). Knowledge base?-setof(child, age(child,age),results). Age = 5, Results = [ann,tom]? ; Age = 7, Results = [peter]? ; Age = 8, Results = [pat]? ; no 11/10/04 AIPP Lecture 6: Built-in Predicates 21

setof/3 (2) We can use a nested call to setof/3 to collect together the individual results:?- setof(age/children, setof(child,age(child,age), Children), AllResults). AllResults = [5/[ann,tom],7/[peter],8/[pat]]? If we don't care about a variable that doesn't appear in the first argument, we use the following form:?- setof(child, Age^age(Child,Age), Results). Results = [ann,pat,peter,tom]? ; no This reads: `Find the set of all children, such that the Child has an Age (whatever it might be), and put the results in Results.' 11/10/04 AIPP Lecture 6: Built-in Predicates 22

bagof/3 bagof/3 is very much like setof/3 except: that the list of results might contain duplicates, and isn t sorted.?- bagof(child, age(child,age),results). Age = 5, Results = [tom,ann,ann]? ; Age = 7, Results = [peter]? ; Age = 8, Results = [pat]? ; no bagof/3 is different to findall/3 as it will generate separate results for all the variables in the goal that do not appear in the first argument.?- findall(child, age(child,age),results). Results = [peter,pat,tom,ann,ann]? ; no 11/10/04 AIPP Lecture 6: Built-in Predicates 23

Summary Showed two techniques for combining lists: Use an accumulator to build up result during recursion: reverse/3 Build result in the head of the clause during backtracking: append/3 Built-in predicates Identifying Terms var/1, nonvar/1, atom/1, atomic/1, number/1, integer/1, float/1, compound/1, ground/1 Decomposing Structures =../2, functor/3, arg/3 Collecting all solutions findall/3, setof/3, bagof/3 11/10/04 AIPP Lecture 6: Built-in Predicates 24