# 程序代写代做代考 prolog data structure CSCI3180 – Principles of Programming Languages – Spring 2017

CSCI3180 – Principles of Programming Languages – Spring 2017

Assignment 4 — Declarative Programming

Deadline: Apr 23, 2017 (Sunday) 23:59

1 Introduction

Declarative programming is a programming paradigm that expresses the logic of a computation

without describing its control flow. You will gain experience of declarative programming with an

emphasis on Prolog and ML in this assignment.

2 Logic Programming

Implement the required predicates or queries of the following two problems in a Prolog program file

named “asg4.pl”. You should clearly indicate using comments the corresponding question number

of each sub-problem. Note that the answers which are queries should be written in comments as

well.

1. A binary tree is either empty or composed of a root and two children, which are binary trees

themselves. A binary tree consists of a set of nodes and lines connecting parent with children.

The nodes are depicted by circles with labels written inside.

Figure 1: An example of binary tree

In Prolog, we represent an empty tree by the atom “nil” and a non-empty tree by the term

“bt(X,L,R)”, where X denotes the root node, L and R denote the left and right subtrees

respectively.

(a) Represent the binary tree shown in Figure 1(a) as a Prolog term.

(b) Define the predicate istree(Term), where “Term” can be any Prolog term. Predicate

istree(Term) is true if “Term” represents a binary tree.

(c) Define the predicate mirror(Tree1, Tree2), where “Tree1” and “Tree2” are both

Prolog terms representing binary trees. Predicate mirror(Tree1, Tree2) is true if

“Tree1” and “Tree2” are mirror images of each other. For example, nil is the mirror

of nil. The two trees in Figure 1(b) are mirror images of each other.

(d) Give a query to generate the mirror image of the tree on the left-hand side in Figure 1(b).

(e) Based on mirror/2, define symmetric(Tree), where “Tree” is a Prolog term repre-

senting a binary tree. Predicate symmetric(Tree) is true if “Tree” is symmetric. For

1

example, nil and a single-node tree are both symmetric. The tree in Figure 1(c) is a

symmetric tree.

2. Recall the successor notation for representing natural numbers, and the sum(X,Y,Z) relation

defined in the lecture which is true if Z is the sum of X and Y .

(a) Define uint num(X) which is true if X is a natural number.

(b) Define gt(X,Y) which is true if X is greater than Y.

(c) Give a query to list all natural numbers less than 3.

(d) Based on sum/3, define product(X,Y,Z) which is true if Z is the product of X and Y.

(e) Give a query to compute the product of 2 and 3.

(f) Give a query to compute the result of 8 divided by 4.

(g) Based on sum/3, define intdiv(X,Y,Z) which is true if Z is the integer quotient of X

divided by Y. If X ≥ Y, X could always be divisible by Y and the quotient is Z. If X < Y,
the quotient is 0.
(h) Give a query to compute the result of 2 divided by 3 using intdiv.
(i) Give a query to compute product of 1 and 2 using intdiv.
3 Functional Programming
Implement the required functions of the following two problems in an ML program file named
“asg4.ml”. You should clearly indicate using comments the corresponding question number of
each sub-problem.
1. A binary tree is a data structure in which each node has a label and at most two children
which are referred to as the left child and right child. Recall the type definition of a binary
tree:
datatype ’a bTree = nil | bt of ’a bTree * ’a * ’a bTree;
where “nil” stands for the empty tree and “bt” is the tag of a non-empty binary tree.
(a) The size of a binary tree is the number of elements in the tree. For example, the size
of an empty tree is 0 and the size of a single element tree is 1. The size of the binary
tree in Figure 1(a) is 7.
Implement an ML function size which takes a binary tree of any type as input and
returns its size. Your function size should make use of pattern matching.
(b) A leaf node of a binary tree is a node without any child nodes, which means the leaf
node has two nil children. The height of a binary tree is the maximum number of edges
from the root to leaf nodes. For example, the empty tree and a single element tree have
a height of 0. The height of the binary tree in Figure 1(a) is 3.
Implement an ML function height which takes a binary tree of any type as input and
returns its height. Your function height should make use of pattern matching.
(c) The number of leaves of an empty tree, namely a nil tree, is 0. A single element tree
has 1 leaf node, which is just the root node. The binary tree in Figure 1(a) has 3 leaf
nodes.
Implement an ML function nleaves which takes a binary tree of any type as input and
returns the number of leaf nodes. Your function nleaves should make use of pattern
matching.
2. Recall the built-in function hd for obtaining the first element of a list. We consider lists of
reals for the following problems. Suppose the input list is always non-empty and the head of
a list is the first element.
(a) Implement an ML function last to return the last element of the input list.
2
(b) Implement an ML function tln, which takes a list L and an integer n as inputs, to
return a list of all but the first n elements of the input list. You can safely assume that
the non-negative integer n is always less than or equal to the length of L.
(c) Implement an ML function hdn, which takes a list L and an integer n as inputs, to
return a list of the first n element of the input list. You can safely assume that the
non-negative integer n is always less than or equal to the length of L.
(d) Based on the function tln, implement an ML function lnth, which takes a list L and an
integer n as inputs, to return the n-th element of the input list. You can safely assume
that the integer n is always greater than 0 and less than or equal to the length of L.
(e) Implement an ML function sum to return the sum of all elements of the input list.
(f) The variance of a list of reals [x1, ..., xn] can be the average of the squares minus the
square of the average. One formula for computing variance is
var(x) =
∑n
i=1 x
2
i
n
−
(∑n
i=1 xi
n
)2
(1)
Use function square, built-in functions length and map and function sum in (e) to
implement an ML function variance to return the variance of the input list. Function
square is defined as
fun square(x:real) = x*x;
val square = fn : real → real
4 Submission Guidelines
Please read the guidelines CAREFULLY. If you fail to meet the deadline because of submission
problem on your side, marks will still be deducted. So please start your work early!
1. In the following, SUPPOSE
your name is Chan Tai Man,
your student ID is 1155234567,
your username is tmchan, and
your email address is tmchan@cse.cuhk.edu.hk.
2. In your source files, insert the following header. REMEMBER to insert the header according
to the comment rule of Prolog and ML.
/∗
∗ CSCI3180 Principles of Programming Languages
∗
∗ --- Declaration ---
∗
∗ I declare that the assignment here submitted is original except for source
∗ material explicitly acknowledged. I also acknowledge that I am aware of
∗ University policy and regulations on honesty in academic work, and of the
∗ disciplinary guidelines and procedures applicable to breaches of such policy
∗ and regulations, as contained in the website
∗ http://www.cuhk.edu.hk/policy/academichonesty/
∗
∗ Assignment 4
∗ Name : Chan Tai Man
∗ Student ID : 1155234567
∗ Email Addr : tmchan@cse.cuhk.edu.hk
∗/
The sample file header is available at
http://course.cse.cuhk.edu.hk/~csci3180/resource/header.txt
3
3. Late submission policy: less 20% for 1 day late and less 50% for 2 days late. We shall not
accept submissions more than 2 days after the deadline.
4. Your solutions for Section 2 will be graded using SICStus Prolog 3.12.7 in the CSE Unix
platform. Solutions for Section 3 will be graded using Standard ML 110.0.7 in the CSE Unix
platform.
5. Tar your source files to username.tar by
tar cvf tmchan.tar asg4.pl asg4.ml
6. Gzip the tarred file to username.tar.gz by
gzip tmchan.tar
7. Uuencode the gzipped file and send it to the course account with the email title “HW4
studentID yourName” by
uuencode tmchan.tar.gz tmchan.tar.gz
| mailx -s "HW4 1155234567 Chan Tai Man" csci3180@cse.cuhk.edu.hk
8. Please submit your assignment using your Unix accounts.
9. An acknowledgement email will be sent to you if your assignment is received. DO NOT
delete or modify the acknowledgement email. You should contact your TAs for help if you do
not receive the acknowledgement email within 5 minutes after your submission. DO NOT
re-submit just because you do not receive the acknowledgement email.
10. You can check your submission status at
http://course.cse.cuhk.edu.hk/~csci3180/submit/hw4.html.
11. You can re-submit your assignment, but we will only grade the latest submission.
12. Enjoy your work :>

4

Introduction

Logic Programming

Functional Programming

Submission Guidelines