## Description

1 Introduction

Declarative programming is a programming paradigm that emphasises the expression of “what” the

problem is over “how” to solve the problem. You will gain experience of declarative programming

with Prolog (Logic Programming) and ML (Functional Programming) in this assignment.

You are supposed to test your work on the machine solar1.cse.cuhk.edu.hk using

• SICStus 3.12.7

• Standard ML of New Jersey, Version 110.0.7

They can be invoked using the commands sics and sml respectively.

2 Logic Programming

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

“asg4.pl”, and recall the successor notation s() to represent natural numbers in this task. You

should clearly indicate using comments the corresponding question number of each problem.

1. Recall the list operations taught in lectures and tutorials.

(a) Define element last(X, L) which is true if the last element in list L is X. Example:

?- element last(e, [a,b,c,d,e]).

yes

(b) Define element n(X, L, N) which is true if the N-th element in list L is X. Example:

?- element n(c, [a,b,c,d,e], s(s(s(0)))).

yes

(c) Define remove n(X, L1, N, L2) which is true if the resulting list L2 is obtained from

L1 by removing the N-th element, and X is the removed element. Example:

?- remove n(X, [a,b,c,d,e], s(s(s(0))), L2).

X = c,

L2 = [a, b, d, e]

(d) Based on (c), give a query to find which list will become [c,b,d,e] after removing its

second element “a”.

(e) Define insert n(X, L1, N, L2) which is true if the resulting list L2 is obtained by

inserting X to the position before the N-th element of list L1. Example:

?- insert n(h, [a,b,c], s(s(0)), L2).

L2 = [a,h,b,c]

(f) Define repeat three(L1, L2) which is true if the resulting list L2 has each element in

list L1 repeated three times. Example:

?- repeat three([a,b,c,d,e],X).

X = [a,a,a,b,b,b,c,c,c,d,d,d,e,e,e]

(g) Based on (f), give a query to find which list will become [i,i,i,m,m,m,n,n,n] after

repeating each element of it for three times.

2. A multi-way tree is composed of a root and a sequence of sub-trees (children), which are

multi-way tree themselves. The list of sub-trees of a certain node is ordered from left to

right and also called a forest. The root of a multi-way tree is a node containing a value.

Diagrammatically, a multi-way tree consists of a set of nodes and lines connecting parents

1

a

b c d

e f g

Figure 1: An example of multi-way tree

and children. The nodes are depicted by circles with values written inside. A multi-way tree

is never empty.

In Prolog, we can represent a multi-way tree by the term “mt(X, F)”, where X denotes the

root and F denotes the forest of sub-trees. Please finish the following questions using the

successor notation s() to represent natural numbers in this task. You can use the sum/3

predicate from the lecture.

(a) Represent the multi-way tree in Figure 1 as a Prolog term, with order of the sub-trees

from left to right. (Hint: represent forest as a list of multi-way tree(s)).

(b) Define the predicate is tree(Term) which is true if Term represents a multi-way tree.

(c) Define the predicate num node(Tree, N) which is true if N is the number of nodes of

the given multi-way tree Tree.

(d) Define sum length(Tree, L) which is true if L is the sum of lengths of all internal

paths in Tree. The length of an internal path from the root node r to an internal node

n is the distance from r to n. For example, the sum of lengths of all internal paths in

the multi-way tree in Figure 1 is: 1 (b) + 1 (c) + 1 (d) + 2 (e) + 2 (f) + 2 (g) = 9

(i.e., s(s(s(s(s(s(s(s(s(0))))))))).

3 Functional Programming

Implement the required functions of the following problems in an ML program file named “asg4.ml”.

You should clearly indicate using comments the corresponding question number of each problem.

This task involves a card game simplified from Texas Hold’em. In each round, two players will

get five cards respectively. The player who has the better hand will win the game. You have to

implement several ML helper functions to determine the better hand.

Please consider the following eight different hands. (We refer to the rules defined on https:

//www.pagat.com/poker/rules/ranking.html.)

• Four of a kind

Four cards of the same rank – such as four queens. The fifth card, known as the kicker, can

be anything. Between two fours of a kind, the one with the higher set of four cards is higher,

so 3-3-3-3-A is beaten by 4-4-4-4-2. If two players have four of a kind of the same rank, the

rank of the kicker decides.

• Full House

2

This combination consists of three cards of one rank and two cards of another rank – for

example three sevens and two tens. When comparing full houses, the rank of the three cards

determines which is higher. For example 9-9-9-4-4 beats 8-8-8-A-A. If the threes of a kind

are equal, the rank of the pairs decides.

• Flush

Five cards of the same suit. When comparing two flushes, the highest card determines which

is higher. If the highest cards are equal then the second highest card is compared; if those

are equal too, then the third highest card, and so on. For example ♠K-♠J-♠9-♠3-♠2 beats

♦K-♦J-♦7-♦6-♦5 because the nine beats the seven. If all five cards are equal, the flushes

are equal.

• Straight

Five cards of mixed suits in sequence. For example ♠Q-♦J-♥10-♠9-♣8. When comparing

two sequences, the one with the higher ranking top card is better. Ace can count high or low

in a straight, but not both at once. So A-K-Q-J-10 and 5-4-3-2-A are valid straights, but

2-A-K-Q-J is not. 5-4-3-2-A, known as a wheel, is the lowest kind of straight, the top card

being the five.

• Three of a Kind

Three cards of the same rank plus two unequal cards. When comparing two threes of a kind

the rank of the three equal cards determines which is higher. If the sets of three are of equal

rank, then the higher of the two remaining cards in each hand are compared, and if those

are equal, the lower odd card is compared. So for example 5-5-5-3-2 beats K-4-4-4-5, which

beats Q-9-4-4-4, which beats Q-8-4-4-4.

• Two Pairs

A pair consists of two cards of equal rank. In a hand with two pairs, the two pairs are of

different ranks (otherwise you would have four of a kind), and there is an odd card to make

the hand up to five cards. When comparing hands with two pairs, the hand with the highest

pair wins, irrespective of the rank of the other cards – so J-J-2-2-A beats 10-10-9-9-8 because

the jacks beat the tens. If the higher pairs are equal, the lower pairs are compared, so that

for example 8-8-6-6-3 beats 8-8-5-5-4. Finally, if both pairs are the same, the odd cards are

compared, so Q-Q-5-5-4 beats Q-Q-5-5-3.

• Pair

A hand with two cards of equal rank and three cards which are different from these and from

one another. When comparing two such hands, the hand with the higher pair is better – so

for example 6-6-4-3-2 beats 5-5-4-3-2. If the pairs are equal, compare the highest ranking

odd cards from each hand; if these are equal compare the second highest odd card, and if

these are equal too compare the lowest odd cards. So J-J-9-3-2 beats J-J-8-7-3 because the

9 beats the 8.

• Nothing

Five cards which do not form any of the combinations listed above. The cards must all be

of different ranks, not consecutive, and contain at least two different suits. When comparing

two such hands, the one with the better highest card wins. If the highest cards are equal the

second cards are compared; if they are equal too the third cards are compared, and so on.

So A-J-9-5-3 beats A-10-9-6-4 because the jack beats the ten.

Note that cards are already sorted in descending order according to the rank (with A always

ordered last). The order of cards of the same rank is arbitrary. Each card has two attributes,

i.e., suit and rank. The type definition of a card in ML is shown below. The joker cards are not

included in this game. To further simplify the problem, we convert all ranks to integers. i.e., A =

1, J = 11, Q = 12, and K = 13.

datatype suit = Clubs | Diamonds | Hearts | Spades;

3

When you implement the following functions, please use pattern matching as much as possible.

1. Write an ML function check flush, which takes a list of five cards and returns if the hand

is a flush.

2. Write an ML function compare flush, which takes two flush card lists. The return value is

a string selected from three candidates. i.e., “Hand 1 wins”, “Hand 2 wins” and “This is a

tie”.

3. Write an ML function check straight, which takes a list of five cards and returns if the

hand is a straight.

4. Write an ML function compare straight, which takes two straight card lists. The return

value is a string selected from three candidates. i.e., “Hand 1 wins”, “Hand 2 wins” and

“This is a tie”.

5. Write an ML function count patterns, which takes a list of five cards and returns the hand

type (Nothing, Pair, Two Pairs, Three of a Kind, Full House, Four of a Kind) and a list of

rank-quantity pairs. Note that the list should be ordered according to the order of comparison

of each type of hand.

Here are some examples to help you understand the problem:

• The card list [(Clubs, 13), (Clubs, 11), (Spades, 7), (Spades, 3), (Hearts, 2)] should

return (Nothing, [(13, 1), (11, 1), (7, 1), (3, 1), (2, 1)]).

• The card list [(Spades, 11), (Spades, 9), (Hearts, 8), (Diamond, 8), (Diamonds, 3)]

should return (Pair, [(8, 2), (11, 1), (9, 1), (3, 1)]).

• The card list [(Clubs, 13), (Spades, 13), (Hearts, 6), (Spades, 1), (Diamonds, 1)] should

return (Two Pairs, [(13, 2), (1, 2), (6, 1)]).

• The card list [(Clubs, 10), (Clubs, 9), (Hearts, 9), (Spades, 9), (Spades, 3)] should return

(Three of a Kind, [(9, 3), (10, 1), (3, 1)]).

• The card list [(Diamonds, 6), (Clubs, 6), (Spades, 6), (Spades, 4), (Diamonds, 4)] should

return (Full House, [(6, 3), (4, 2)]).

• The card list [(Diamonds, 11), (Spades, 11), (Clubs, 11), (Hearts, 11), (Hearts, 10)]

should return (Four of a Kind, [(11, 4), (10, 1)]).

6. Write an ML function compare count, which takes two card lists and returns a string selected

from three candidates. i.e., “Hand 1 wins”, “Hand 2 wins” and “This is a tie”. You only

need to consider the remaining six cases except flush and straight, and assume that

Nothing < Pair < Two Pairs < Three of a Kind < Full House < Four of a Kind.
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.
4
/∗
∗ 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. 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. Tar your source files to username.tar by
tar cvf tmchan.tar asg4.pl asg4.ml
5. Gzip the tarred file to username.tar.gz by
gzip tmchan.tar
6. 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
7. Please submit your assignment using your Unix accounts.
8. 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.
9. You can check your submission status at
http://course.cse.cuhk.edu.hk/~csci3180/submit/hw4.html.
10. You can re-submit your assignment, but we will only grade the latest submission.
11. Enjoy your work :>

5