[Haskell-beginners] Question about Interpretation as Least Fixed Point from Denotational semantics article

Dmitriy Matrosov sgf.dma at gmail.com
Tue Jan 16 14:10:13 UTC 2024


Hi.

I'm reading denotational semantics article on haskell
wikibook and don't understand following statement from the
["Interpretation as Least Fixed Point" chapter][1] chapter:

> However, there might be multiple fixed points. For instance, there are
> several f which fulfill the specification
>
>       f = n -> if  n == 0  then  1  else  f (n + 1)
>
> Of course, when executing such a program, the machine will loop forever on
> f(1)  or f(2) and thus not produce any valuable information about the value
> of f(1).

What is this f exactly?

If it's just another recursive function, like the factorial
was before, then it has a little difference from it to me:
the above f is defined on n <= 0 and not defined on n > 0.
Whereas factorial is defined on other part of values.  Thus,
both functions will not produce any results on certain
values, if such program is executed: for the above f this is
f(1), f(2), etc, but for factorial this is f(-1), f(-2), etc
(who prevents me from executing factorial program on
negative integers, after all?).

Both functions can be approximated using corresponding
functional g and fixed point iteration scheme, like was
explained in the article earlier:

    x0, g(x0), g(g(x0)), ..

where x0 == _|_ .  So, essentially this functions looks to
me exactly the same as factorial and i don't understand what
this example is supposed to show?

If the right hand side is functional g' defined as

    g'(f) = n -> if n == 0 then 1 else f (n + 1)

and we try to find it's fixed point, i.e. such f, that

    f = g'(f)

then i can't understand, why would we try to execute f(1) at all?

And by the way, these "multiple fixed points of function f",
are they just (const 1) for n <= 0 and any other values for
n > 0? I.e. this

    if n <= 0 then 1 else undefined

is least defined fixed point, but this one:

    if n <= 1 then 1 else undefined

is also fixed point, just not the least defined, and this one:

    if n <= 0 then 1 else 3

is also a fixed point. Is this correct?

Thanks.

[1]: https://en.wikibooks.org/wiki/Haskell/Denotational_semantics#Interpretation_as_Least_Fixed_Point


More information about the Beginners mailing list