Рис.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 (“папа”) – используются для вычисления одноимённых родственных отношений.
Выполнение процедуры поиска решений Турбо-Прологом можно проследить в режиме трассировки. Для этого необходимо добавить оператор (опцию) 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 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.