Пример 2

Рассмотрим построение программы, которая позволяет определить родственные связи вашей семьи. В основу построения программы возьмем предикат родители (мама, папа, ребенок). Такой выбор базовой связи позволяет автоматически определить папу и маму.

Следует отметить, что не следует создавать типы папа, мама, ребенок и т.п., так как в одном случае аргумент может быть дедушкой, а в другом – сыном.

Например, программа для определения дедушки будет иметь следующий вид

implement main
open core
class facts
man: (symbol).
woman: (symbol).
parents: (symbol,symbol,symbol).
class predicates

gr_father: (symbol,symbol,symbol) nondeterm anyflow.

clauses
classinfo("family", "1.0").

parents("pavel","olga","misha").
parents("anna","mariya","sergey").
parents("igor","anna","pavel").
parents("vita","anna","pavel").
man("petr").
man("pavel").
man("igor").
man("sergey").
man("misha").
woman("mariya").

woman("anna").
woman("olga").
woman("vita").

gr_father(X,Y):-parents(X,_,F),parents(F,_,Y),man(Y).
gr_father(X,Y):-parents(X,M,_),parents(M,_,Y),man(Y).

run():-
console::init(),

gr_father(stdio::read(),Y),stdio::nl,stdio::write(Y),stdio::nl,fail.

run():-
stdio::write("fail"),succeed().
end implement main
goal
mainExe::run(main::run).

Так как каждый человек должен иметь дедушку как по отцовской линии, так и по материнской, то задача решается с помощью двух правил. Можно было бы объединить эти два правила в одно с помощью логической операции or (или). Но в этом случае правило стало бы более трудным для понимания и, как следствие, возросла бы вероятность допущения ошибки. В обоих правилах необходимо употребление анонимной переменной. Это объясняется тем, что в первом правиле имена мамы и бабушки встречались бы только один раз, что запрещено синтаксисом. Аналогичная ситуация с именами папы и бабушки в правиле для определения дедушки по материнской линий.

ЛЕКЦИЯ 3




double arrow
Сейчас читают про: