Computer 10: Lesson 10 - Online Crimes and Hazards
Iteration
1. A I P ro g ra m m ing
Week Five: Iteration
Richard Price
rmp@ cs.bham.ac.uk
www.cs.bham.ac.uk/~rmp/
www.cs.bham.ac.uk/internal/courses/ai-prog-a/
2. R ec a p
• Last week:
– If … then … elseif… else… endif
– Lists & pattern matching.
Lvars input, name;
‘Hello what is your name? =>
Readline( - input; ;;; reads a line from the keyboard.
)>
If input matches ![Hello my is ?name] then
[Hello ^name] =>
Else
[Erm… hello] =>
Endif;
2
3. !
• !(exclamation mark)is important.
• Tells pop- 1 that there is a variable created
1
with lvars .
• Without !matches does not work.
If input matches ![Hello my is ?name] then
3
4. C o m pa ris o n O pera to rs
• Operators return <true> or <false>.
• Define your own!
define lessThanTen( aNumber)- result;
>
If aNumber < 1 0 then
<true> - result;
>
else
false - result;
>
endif;
…
If lessThanTen(
aVariable)then
…
4
5. E rm … hello .
Lvars input, name;
‘Hello what is your name? =>
Readline( - input; ;;; reads a line from the keyboard.
)>
If input matches !
[Hello my is ?name] then
[Hello ^name] =>
Else
[Erm… hello] =>
Endif;
• What if our program is a natural language based database.
• And needs that users name!
5
6. I tera tio n
• Often we want our code to repeat:
– Until we get a satisfactory answer.
– For a number of turns in a board game.
– While certain conditions are met.
• Pop- 1 does this using iteration .
1
– loops.
6
7. R epea t
repeat <number> times
<code>
endrepeat;
repeat 5 times
‘Give me 5! =>
’
endrepeat;
* Give me 5!
*
* Give me 5!
*
* Give me 5!
*
* Give me 5!
*
* Give me 5!
*
7
8. Fo r
for <variable> to <number> do
<code>
endfor;
Lvars counter;
for counter to 5 do
counter 5 =>
endfor;
• <variable> tracks the loop.
• Starting at 1 .
8
9. M o re Fo r
lvars counter;
for counter from - to 5 do
5
counter =>
endfor;
• Will print from - to 5 inclusively.
5
for counter from 1 0 by 2 to 20 do
counter =>
endfor;
• Prints 1 0, 1 2, 1 4, 1 6, 1 8 and 20.
9
10. W hile
while <condition> do
<code>
endwhile;
lvars total = 1 ;
while lessThanTen(
total)do
total + random( - total;
5) >
total =>
endwhile;
• Adds a random number ( from 1 up to 5)to total.
• Prints total until it’s greater than 1 0.
10
11. W hile
‘Hello, what is your name?’ =>
lvars userName, correctInput = <false>, userInput;
While not(
correctInput)do
readline( - userInput;
)>
if userInput matches ! my name is ?userName ==] then
[==
[Hello ^userName] =>
<true> - correctInput;
>
else
[I am sorry, I did not catch that. W hat is your name?] =>
endif;
endwhile;
• Repeatedly asks the user for a suitable name.
11
12. Fo r lis ts
lvars exampleList = [1 2 3], listCounter = length(
exampleList)
;
for counter from 1 to listCounter do
exampleList(
counter)=>
endfor;
• Prints 1 , 2 then 3.
• But so does:
lvars itemInList, exampleList = [1 2 3]
for itemInList in exampleList do
itemInList =>
endfor;
12
13. Fo r lis ts
lvars itemInFirstList, itemInSecondList;
Lvars mergedList = [ ], firstList = [1 2 3], secondList = [a b c];
for itemInFirstList, itemInSecondList
in firstList, secondList do
[^^mergedList ^itemInFirstList ^itemInSecondList] - mergedList;
>
endfor;
mergedList =>
* [1 a 2 b 3 c]
*
• Ineffecient!
13
14. D ec o ra ted B ra c k ets
• Decorations % … % build lists via the stack.
– When Pop- 1 sees the first % anything placed on the
1
stack is considered to be an item in a list.
– When the second % all items on the stack are collected.
– And inserted into a list in one go.
lvars counter;
[%
for counter to 5 do
counter;
endfor;
% ] =>
* [1 2 3 4 5]
*
14
15. Fo r lis ts
[^^mergedList ^itemInFirstList ^itemInSecondList] - mergedList;
>
lvars itemInFirstList, itemInSecondList;
Lvars firstList = [1 2 3], secondList = [a b c];
[%
for itemInFirstList, itemInSecondList
in firstList, secondList do
itemInFirstList; ;;; leaves an item from the first list onto the stack.
itemInSecondList; ;;; leaves an item from the second list onto the stack.
endfor;
% ] - merged_list;
>
merged_list =>
* [1 a 2 b 3 c]
*
15
16. I nfinite lo ops
• At some point you will make an infinite loop.
• Which will run forever.
• At this point the only way to stop Pop- 1 is to hold
1
down control and press c .
• If this doesn’t work type xkill & into the terminal.
• And click on the window to kill.
• Save your work often!
16