# 6.20 Example: Testing for Palindromes¶

In this section we define a function pal? that tests whether its palindrome argument is a palindrome, that is, something that reads the same backwards and forwards. For example, the string Madam I’m Adam’’ is a palindrome (excluding blanks and punctuation) and so is the number 123454321. The definition works for any datatype that has n components that are accessed by the indices 1…n.

Here is the definition for pal?. It is simply a call to an auxiliary function called palAux?. We are following the convention of ending a function’s name with ? if the function returns a Boolean value.

pal? s == palAux?(s,1,#s)


Type: Void

Here is palAux?. It works by comparing elements that are equidistant from the start and end of the object.

palAux?(s,i,j) ==
j > i =>
(s.i = s.j) and palAux?(s,i+1,i-1)
true


Type: Void

Try pal? on some examples. First, a string.

pal? "Oxford"

Compiling function palAux? with type (String,Integer,Integer) ->
Boolean
Compiling function pal? with type String -> Boolean


 false

Type: Boolean

A list of polynomials.

pal? [4,a,x-1,0,x-1,a,4]

Compiling function palAux? with type (List Polynomial Integer,
Integer,Integer) -> Boolean
Compiling function pal? with type List Polynomial Integer -> Boolean


 true

Type: Boolean

A list of integers from the example in the last section.

pal? [1,6,15,20,15,6,1]

Compiling function palAux? with type (List PositiveInteger,Integer,
Integer) -> Boolean
Compiling function pal? with type List PositiveInteger -> Boolean


 true

Type: Boolean

To use pal? on an integer, first convert it to a string.

pal?(1441::String)


 true

Type: Boolean

Compute an infinite stream of decimal numbers, each of which is an obvious palindrome.

ones := [reduce(+,[10^j for j in 0..i]) for i in 1..]


 [11,111,1111,11111,111111,1111111,..11111111,111111111,1111111111,11111111111,…]

Type: Stream PositiveInteger

)set streams calculate 9


How about their squares?

squares := [x^2 for x in ones]


 [121,12321,1234321,123454321,12345654321,1234567654321,.123456787654321,12345678987654321,1234567900987654321,.123456790120987654321,…]

Type: Stream PositiveInteger

Well, let’s test them all.

[pal?(x::String) for x in squares]


 [true,true,true,true,true,true,true,true,true,true,…]

Type: Stream Boolean

)set streams calculate 7