If you need help reviewing Logic, take a look at these resources:
We will be using the Logic interpreter, which you can get here. You can run the Logic interpreter from your terminal with:
python3 logic
You can load a .logic
file with
python3 logic -load file.logic
Alternatively, you can use the online Logic interpreter
Each question has a "Toggle Solution" button -- click it to reveal that question's solution.
Code-Writing questions
Question 1
Write a fact or set of facts for the interleave
relation, which
checks if two given lists will interleave into a third given list. You
cannot assume that the lists are of equal length.
(fact (interleave ; YOUR CODE HERE
; Tests
logic> (query (interleave (1 2) (3 4) (1 3 2 4)))
Success!
logic> (query (interleave (1 2) (3 4) (1 2 3 4)))
Failed.
logic> (query (interleave (1 2) (3 4 5) ?what))
Success!
what: (1 3 2 4 5)
(fact (interleave ?lst () ?lst))
(fact (interleave () ?lst ?lst))
(fact (interleave (?a . ?x) (?b . ?y) (?a ?b . ?z))
(interleave ?x ?y ?z))
Question 2
Write a fact or set of facts for the zip
relation, which checks if
two given lists will zip into a third given list (see the tests to get
an idea of what "zip" means). You can assume that the lists are of
equal length.
(fact (zip ; YOUR CODE HERE
; Tests
logic> (query (zip (1 2) (3 4) ((1 3) (2 4))))
Success!
logic> (query (zip (1 2) (3 4) (1 3 2 4)))
Failed.
(fact (zip () () ()))
(fact (zip (?a . ?x) (?b . ?y) ((?a ?b) . ?z))
(zip ?x ?y ?z))
Question 3
Write a fact or set of facts for the reverse
relation, which takes
two lists and checks if the second list is the reverse of the first.
You can assume the append
relation is already defined.
(fact (reverse ; YOUR CODE HERE
; Tests
logic> (query (reverse (1 2 3 4) (4 3 2 1)))
Success!
logic> (query (reverse (1 2 3) (2 1 3)))
Failed.
logic> (query (reverse (4 2 5) ?what))
Success!
what: (5 2 4)
(fact (reverse () ()))
(fact (reverse (?f . ?rest) ?lst)
(reverse ?rest ?reverse-rest)
(append ?reverse-rest (?f) ?lst))
Logical Trees (courtesy of Sarah Kim)
The following questions were written by Sarah Kim for Summer 2013.
Let's create a series of facts on a tree diagram. The facts are of the following form:
(fact (tree number entry left right))
Some examples:
(fact (tree tree-1 6 tree-2 tree-3))
(fact (tree tree-2 4 tree-4 tree-5))
(fact (tree tree-3 8 tree-6 tree-7))
(fact (tree tree-4 3 tree-8 none))
(fact (tree tree-5 5 none none))
(fact (tree tree-6 7 none none))
(fact (tree tree-7 11 tree-9 tree-10))
(fact (tree tree-8 2 tree-11 none))
(fact (tree tree-9 9 none tree-12))
(fact (tree tree-10 12 none none))
(fact (tree tree-11 1 none none))
(fact (tree tree-12 10 none none))
Question 4
Write a find-entry
fact that associates tree number to tree entry.
logic> (query (find-entry tree-12 10))
Success!
logic> (query (find-entry tree-2 ?x))
Success!
x: 4
logic> (query (find-entry ?tree 11))
Sucess!
tree: tree-7
(fact (find-entry ?number ?entry)
(tree ?number ?entry ?left ?right))
Question 5
Write a check-leaf
fact that checks if a tree is a leaf (no trees in
left or right).
logic> (query (check-leaf tree-12))
Sucess!
logic> (query (check-leaf tree-4))
Failed.
(fact (check-leaf ?number)
(tree ?number ?leaf none none))
Question 6
What would Logic print?
logic> (query (check-leaf ?x))
______Success!
x: tree-5
x: tree-6
x: tree-10
x: tree-11
x: tree-12
Question 7
Write asmallest-entry
fact that finds the smallest entry of a tree.
logic> (query (smallest-entry tree-2 ?leaf))
Success!
leaf: 1
logic> (query (smallest-entry tree-12 ?leaf))
Success!
leaf: 10
logic> (query (smallest-entry tree-7 ?leaf))
leaf: 9
(fact (smallest-entry ?number ?entry)
(tree ?number ?entry none ?right))
(fact (smallest-entry ?number ?entry)
(tree ?number ?other-entry ? left ?right)
(smallest-entry ?left ?entry))
Question 8
Write a find-parent
fact, which finds the parent of a number.
logic> (query (find-parent tree-11 ?parent))
Success!
parent: tree-8
(fact (find-parent ?number ?parent)
(tree ?parent ?entry ?number ?right))
(fact (find-parent ?number ?parent)
(tree ?parent ?entry ?left ?number))
Question 9
Write a generation
fact, which lists all the members of a tree's
family tree.
logic> (query (generation tree-11 ?members))
Success!
members: tree-1
members: tree-2
members: tree-4
members: tree-8
members: tree-11
(fact (generation ?number ?grandfather)
(find-parent ?number ?father)
(generation ?father ?grandfather))
(fact (generation ?number ?number))
Question 10
What would happen if for the generation
fact, we put the second fact
before the first fact?
logic> (query (generation tree-11 ?members))
Success!
members: tree-11
members: tree-8
members: tree-4
members: tree-2
members: tree-1