6.3 Exercises

Exercise 6.1

Let's call a list doubled if it is made of two consecutive blocks of elements that are exactly the same. For example, [a,b,c,a,b,c] is doubled (it's made up of [a,b,c]followed by [a,b,c]) and so is [foo,gubble,foo,gubble]. On the other hand, [foo,gubble,foo] is not doubled. Write a predicate doubled(List) which succeeds when List is a doubled list.

Exercise 6.2

A palindrome is a word or phrase that spells the same forwards and backwards. For example, `rotator', `eve', and `nurses run' are all palindromes. Write a predicate palindrome(List), which checks whether List is a palindrome. For example, to the queries

?- palindrome([r,o,t,a,t,o,r]).

and

?- palindrome([n,u,r,s,e,s,r,u,n]).

Prolog should respond `yes', but to the query

?- palindrome([n,o,t,h,i,s]).

Prolog should respond `no'.

Exercise 6.3

  1. Write a predicate second(X,List) which checks whether X is the second element of List.

  2. Write a predicate swap12(List1,List2) which checks whether List1 is identical to List2, except that the first two elements are exchanged.

  3. Write a predicate final(X,List) which checks whether X is the last element of List.

  4. Write a predicate toptail(InList,Outlist) which says `no' if inlist is a list containing fewer than 2 elements, and which deletes the first and the last elements of Inlist and returns the result as Outlist, when Inlist is a list containing at least 2 elements. For example:

        toptail([a],T).
        no
       
        toptail([a,b],T).
        T=[]
      
        toptail([a,b,c],T).
        T=[b] 

    Hint: here's where append comes in useful.

  5. Write a predicate swapfl(List1,List2) which checks whether List1 is identical to List2, except that the first and last elements are exchanged. Hint: here's where append comes in useful again.

Exercise 6.4

And here is an exercise for those of you who, like me, like logic puzzles.

There is a street with three neighboring houses that all have a different color. They are red, blue, and green. People of different nationalities live in the different houses and they all have a different pet. Here are some more facts about them:

  • The Englishman lives in the red house.

  • The jaguar is the pet of the Spanish family.

  • The Japanese lives to the right of the snail keeper.

  • The snail keeper lives to the left of the blue house.

Who keeps the zebra?

Define a predicate zebra/1 that tells you the nationality of the owner of the zebra.

Hint: Think of a representation for the houses and the street. Code the four constraints in Prolog. member and sublist might be useful predicates.


Patrick Blackburn, Johan Bos and Kristina Striegnitz
Version 1.2.5 (20030212)