Логическое программирование. Элементы и конструкции языка Турбо-Пролог. Средства отладки Турбо-Пролога, страница 12

Рис.3 Схема родственных отношений.

/* Программа 4 */ domains    person = symbol predicates    roditel(person, person)    rebenok(person, person) male(person) female(person) sestra(person, person) brat(person,person) ded(person,person) baba(person,person) tetya(person,person) dadya(person,person) mama(person,person) papa(person,person)

clauses      roditel(ola,sasha).    roditel(vita,sasha).    roditel(vita,kata).    roditel(vita,kola).    roditel(sasha,ana).    roditel(sasha,vera).    male(sasha).    male(vita).    male(kola).       female(ola).    female(kata).    female(ana).    female(vera).    rebenok(Y, X) :- roditel(X, Y).

sestra(X, Y):-female(X),       roditel(Z, X),       roditel(Z, Y),      X<>Y.

brat(X, Y):-male(X),       roditel(Z, X),       roditel(Z, Y), 

    X<>Y.

ded(X, Y):-male(X), 

     roditel(X, Z),       roditel(Z, Y).

baba(X, Y):-female(X),       roditel(X, Z),       roditel(Z, Y).

tetya(X, Y):-female(X), 

     roditel(Z, Y),       sestra(X, Z).

dadya(X, Y):-male(X),       roditel(Z, Y),       brat(X, Z).

mama(X, Y):-female(X),       roditel(X, Y). papa(X, Y):-male(X), 

     roditel(X, Y).

Определённые в программе предикаты: brat (“брат”), ded(“дедушка”), baba(“бабушка”), tetya(“тётя”), dadya(“дядя”), mama(“мама”), papa (“папа”) – используются для вычисления одноимённых родственных отношений.

6. Средства отладки Турбо-Пролога

Выполнение процедуры поиска решений Турбо-Прологом можно      проследить          в        режиме       трассировки.       Для   этого необходимо добавить оператор (опцию) trace в начало программы, а после запуска использовать клавишу F10 для пошагового выполнения программы. Каждый шаг при этом отслеживается в окне трассировки.

Рассмотрим, в качестве примера, программу, в которую включён оператор trace, и проследим за её пошаговым выполнением:

/*Программа 5 */

                              trace

domains       person=symbol

predicates

     roditel(person, person) clauses       roditel(ola, sasha).

     roditel(vita, sasha). roditel(vita, sasha).       roditel(sasha, ana).       roditel(sasha, vera).       roditel(vera, kola).

Решим    с        помощью   этой программы       следующую составную задачу:

                               Goal:roditel(vita, X), roditel(X,Y)

Пошаговое решение данной задачи с помощью клавиши F10 будет выглядеть следующим образом:

                                       окно трассировки                             диалоговое окно

                                                     TRACE                                             DIALOG

      CALL:roditel("vita", _)                               

      REDO:roditel("vita", _)                              

      RETURN:*roditel("vita", "sasha")             

CALL:roditel("sasha", _)        REDO:roditel("sasha", _)       

REDO:roditel("sasha", _)

REDO:roditel("sasha", _)

RETURN:*roditel("sasha", "ana")

X=sasha, Y=ana

REDO:roditel("sasha",_)

RETURN:roditel("sasha", "vera")

X=sasha, Y=vera

REDO:roditel("vita", _)

RETURN:roditel("vita", "kata")

CALL:roditel("kata",_)

REDO:roditel("kata",_)

REDO:roditel("kata",_)

REDO:roditel("kata",_)

REDO:roditel("kata",_)

REDO:roditel("kata",_)

FAIL:roditel("kata",_)

2 Solutions