? users online
  • Logout
    • Open hangout
    • Open chat for current file
<div class="notebook">

<div class="nb-cell markdown" name="md1">
# Example of `notebook` page style

This is a **notebook version** of the example page: contains
**runnable examples**. 

- For supporting several Prologs probably a different
  version of the notebook for each Prolog is needed. 
- For example this one would be the Ciao/ALD version (serverless)
  and this the SWISH version (server-based).


## An example:

Consider the factorial example, using Peano arithmetic, that we saw in the first part of the course:

~~~{.pl}
factorial(0,s(0)).
factorial(s(N),F) :-
    factorial(N,F1),
    times(s(N),F1,F).
~~~

This version is very attractive:
  - It is fully reversible!
  - But also inefficient...

However, we can also code it using ISO-Prolog arithmetic, i.e., `is/2`:
```prolog
 ... Z is X * Y ... 
```

Note that this type of arithmetic has limitations: it only works in
one direction, i.e., `X` and `Y` must be bound to 
arithmetic terms.

But it provides a (large!) performance gain.  Also, meta-logical tests
(see later) allow using it in more modes.

The factorial program can be encoded using `is/2` as follows:

</div>

<div class="nb-cell program" name="p1">
factorial(0,1). 
factorial(N,F) :-
    N &gt; 0,
    N1 is N-1,
    factorial(N1,F1),
    F is F1*N.
</div>

<div class="nb-cell markdown" name="md2">
Try it:
</div>

<div class="nb-cell query" name="q1">
factorial(20,F).
</div>

<div class="nb-cell markdown" name="md3">
Now it works even for very large numbers: 
</div>

<div class="nb-cell query" name="q2">
factorial(100,F).
</div>

<div class="nb-cell markdown" name="md4">
Note that wrong goal order can raise an error (e.g., moving the last
call to `is/2` before the call to factorial). We can solve this using constraints: 
</div>

<div class="nb-cell program" name="p2">
:- use_module(library(clpq)).

factorialc(0,1). 
factorialc(N,F) :-
    { 
      N &gt; 0,
      N1 = N-1
    },
    factorialc(N1,F1),
    {
      F = F1*N
    }.
</div>

<div class="nb-cell markdown" name="md5">
And now it runs in both directions, and more efficiently than Peano: 
</div>

<div class="nb-cell query" name="q3">
factorialc(8,F).
</div>

<div class="nb-cell query" name="q4">
factorialc(N,40320).
</div>

</div>