Методології програмування. Основні методології, страница 4

(cons   1  ' (a b c))   -->   (1 a b c) ;

(cons   (list  'a)   ' (a  b  c))   -->   ((a)  a  b  c) .

Функція  append об’єднує два списки, наприклад:

(append   (list  1 2)   (list 3 4))   -->   (1 2 3 4) .

Якщо необхідно вибрати один з варіантів – можна скористатися умовним виразом cond. Функція cond має довільне число аргументів, кожний з яких повинний бути списком із двох елементів. При обчисленні функції cond Lisp переглядає по черзі кожну пару, починаючи з першої, якщо значення першого елемента чергової пари true, то повертається значення другого елемента пари й обробка функції cond припиняється, в іншому випадку відбувається перехід до наступної пари. Якщо жодна пара не має значення true для першого елемента, то значення функції cond невизначене. Щоб уникнути цього, за перший елемент останньої пари потрібно використовувати атом T, наприклад:

(setq   n  1)    -->    1

(cond ((=  n 1)  'one)  ((=  n  2)  'two)  (t  'much))

                                                -->   one.

Для визначення нових функцій призначена функція  defun, вона має три аргументи: перший – ім'я обумовленої функції, другий – список формальних параметрів, третій – вираз, який визначає значення функції. Визначимо, наприклад, функцію x2

(defun square (x) (* x x))    -->   square . 

Виклик функції square: 

(square 5)   -->    25 .        

За допомогою cond  можна створювати рекурсивні функції, наприклад:

(defun fakt (n) (cond ((= n 0) 1) (t (* n (fakt (- n 1))))))

                                                -->   fakt ;

(fakt  5)   -->   120 .

Приклад виконання завдання. Мовою функціонального програмування описати і застосувати функцію, що обчислює відстань від довільної точки на площині до точки з координатами (2,3).

Запис даної функції мовою Лісп може мати вигляд

(defun  dist  (x   y)   (sqrt  (+   (*   (-   x   1)   (-   x   1))  (*   (-   x   1)   (-   x   1))   ))  ).

Виклик даної функції може бути таким: (dist  2   3).

6.8 Логічне програмування

Логічне програмування ґрунтується на правилах логічного виведення. Математичною моделлю тут є вирахування предикатів.

У найбільш відомій мові логічного програмування Prolog аксіоми називають фактами, а правила виведення обмежені хорнівськими виразами (диз’юнктами Хорна).

Хорнівський вираз містить не більше одного позитивного літерала, тобто може бути записаний у формі

       a   b1   b2   ...   bn .       

Цей вираз можна переписати у формі імплікації

       a ← b1  b2  ...  bn .

Тут використані еквівалентності

       (P   Q) ≡ ( P → Q)

        (P   Q) ≡ ( P  Q)

Програма на мові Prolog складається з фактів

        a ← ,  a ← ,

і правил вигляду   a ← b1   ...  bn .   

При цьому операція  (і) позначається в програмі “,” ,  (або) – “;”, а операція   ← (тільки якщо) позначається   “ :- ”.

Наведемо коротку інструкцію для роботи з Турбо-Прологом 2.0.

Функціональні клавіші:

        F9   -     Compile ,      Alt-R  -     Run

        F10   -   покрокове трасування.

Стандартні області (типи даних): char, наприклад 'а'; string, наприклад “text”; integer;  real; symbol – послідовність з букв і цифр, що починається з букви.

Приклади програм

Програма 1  Реалізація сімейних відношень

predicates

     male(symbol)

     female(symbol)

     father(symbol,symbol)

     mother(symbol,symbol)

     parent(symbol,symbol)

     sister(symbol,symbol)

     brother(symbol,symbol)

     grandfather(symbol,symbol)

clauses

     male(alan).

     male(charles).

     male(bob).

     male(ivan).

     female(beverly).

     female(fay).

     female(merilyn).

     female(sally).

     mother(marilyn,beverly).

     mother(alan,sally).

     father(alan,bob).

     father(beverly,charles).

     father(fay,bob).

     father(marilyn,alan).

     parent(X,Y):-mother(X,Y);father(X,Y).