Metadata
Title
15A: Termination Determination
Category
general
UUID
e20d86cba43e46e698b2b6946a78b2e4
Source URL
https://cscircles.cemc.uwaterloo.ca/15a-basic/
Parent URL
https://cscircles.cemc.uwaterloo.ca/
Crawl Time
2026-03-18T05:14:02+00:00
Rendered Raw Markdown

15A: Termination Determination

Source: https://cscircles.cemc.uwaterloo.ca/15a-basic/ Parent: https://cscircles.cemc.uwaterloo.ca/

Exercises 15A, 15B, and 15C can be completed in any order.

In this lesson you will complete a long and complex problem that has been broken into parts for you. This lesson also introduces str.split(), a useful method for splitting strings: it deletes all of the spaces, and then returns a list of all of the words in the string. The original string is not modified.

Example

Examples of str.split()

S = 'This is a string' words = S.split() print(words) print(len(words)) print(words[1]) print(S) # S is not changed print(' Another example of split '.split())

You can call split() with special arguments to do more sophisticated splitting, but we don't need this ability below. If you are interested, check the Python documentation.

Now we get to the task at hand. The old programming language BASIC was famous for its numbered lines and goto statements. For this exercise, you will implement a simple version of BASIC with just these features. Specifically, the input to your program will consist of several lines in the format

«label» goto «target»

where «label» and «target» are positive integers. The label is like the name or address of the line; all labels are unique. The target tells you the label of the line to move to next. The last line of the program is «label» END indicating that you should stop once you move to this line. Here is a sample BASIC program:

5 GOTO 30
10 GOTO 20
20 GOTO 10
30 GOTO 40
40 END

When BASIC runs the program, this is what happens. We begin at the first line (with label 5). The line with label 5 has target 30, so next we go to the line with label 30. Then line 30 tells us to go to line 40. Line 40 tells us to END. So, the program terminated successfully.

On the other hand, a BASIC program can also loop forever. Here is an example:

10 GOTO 21
21 GOTO 37
37 GOTO 21
40 END

The program starts at line 10, but then it loops forever between lines 21 and 37.

Your task is to write a Python program, which reads a BASIC program as input. If the program terminates, your program should print success. If the program enters an infinite loop, your program should print infinite loop. Assume each target equals some valid label and that all labels are unique, so you do not have to do error-checking.

There are several ways you could do this, but in this lesson we have chosen one simple approach that breaks the problem in to 3 sub-tasks. (In lesson 15C you have one large problem and design the sub-tasks yourself.)

Sub-task 1: Reading the program

To read the program, we need to keep calling input(). However, we need to stop calling input() once the last line (the one with END) is reached, to avoid an EOFError.

Coding Exercise: Reading the Program

Write a function getBASIC() which takes no arguments, and does the following: it should keep reading lines from input using a while loop; when it reaches the end it should return the whole program in the form of a list of strings. (Hints: about lists and stopping)

You need to create an account and log in to ask a question.

delete this comment and enter your code here

You may enter input for the program in the box below.

More actions... History Help

Sub-task 2: Go to it!

Once we have read the program, we need to be able to move from line to line in the program. To accomplish this, we ask you to write the following subroutine.\

Coding Exercise: Go to it!

Define a function findLine(prog, target) to perform the following. Assume prog is a list of strings containing a BASIC program, like the type generated by getBASIC(); assume target is a string containing a line number, which is the target of a GOTO statement. The function should return the index i (a number between 0 and len(prog)-1) such that prog[i] is the line whose label equals target. Hint \ Sample input/output: If you call

findLine(['10 GOTO 20','20 END'], '10')

then the output should be 0, since item 0 of the list is the line with label 10.

You need to create an account and log in to ask a question.

delete this comment and enter your code here

Enter testing statements like print(myfunction("test argument")) below.

More actions... History Help

Sub-task 3: Smart Simulation

In the previous two exercises, we handled the input routine and the searching task. These will be useful to make writing the main program shorter. However, there is still a major question: how can we actually solve the original problem? The most straightforward way would be to simulate the BASIC program:

But, there is a major problem: this doesn't detect infinite loops, and if the BASIC program has an infinite loop, then the Python program will also loop forever. What we wanted was that the program should print "infinite loop" in this situation. We leave this problem for you to solve; we give a hint below.

Coding Exercise: Smart Simulation

Write a function execute(prog) to do the following. Assume prog is a list of strings containing the BASIC program, like before. Then, your function should return either "success" or "infinite loop" depending on whether the program terminates, or loops forever. Important: you should assume the procedure findLine(prog, target) defined in sub-task 2 is already defined, you do not need to re-write it. Hint

You need to create an account and log in to ask a question.

here is a broken solution to get you started

def execute(prog): location = 0 while True: if location==len(prog)-1: return "success"

get T from prog[location] via str.split

location = findLine(prog, T)

Enter testing statements like print(myfunction("test argument")) below.

More actions... History Reset code to default Help

Putting it all together

To test your code as a complete solution, copy and paste your previous solutions into the following template.

Coding Exercise: BASIC Simulator

Put together your BASIC simulator.

You need to create an account and log in to ask a question.

def getBASIC from subtask 1

def findLine from subtask 2

def execute from subtask 3

print(execute(getBASIC()))

You may enter input for the program in the box below.

More actions... History Reset code to default Help

If your programming language is slightly more complicated, then it's impossible to write a termination-checking program. This was the earliest important theorem in computer science, proven by Alan Turing in the 1930s, and nowadays people refer to the result by saying "the Halting Problem is undecidable."