Пример 1.
Рассмотрим задачу поиска девушкой жениха, который должен удовлетворять определенным ее требованиям. Если ввести предикат
man (symbol, symbol, integer),
где аргументы могут обозначать имя, цвет глаз, возраст и т.п., это правило приобретет вид
ideal(X):- man(X,C,A), C=blue, A<=30.
Обычно количество требований-аргументов можно увеличивать практически неограниченно и, кроме того, возможна ситуация, когда какой-либо из аргументов имеет несколько свойств. Например, автомобиль характеризуется маркой, мощностью двигателя, цветом и т.д. В таких случаях применяются сложные структуры данных, которые формируются с помощью стандартных типов Пролога. Эти структуры называются функторами и имеют следующий формат записи
имя_функтора(свойство1, свойство2, , свойство )
Поставим в нашей задаче дополнительное требование, чтобы идеальный друг имел некоторую собственность. Каждую возможную форму собственности можно изобразить в форме функтора, а их многообразие записать с помощью альтернативного задания типов.
Например, введем предикат владеть(объект) или have(object), и пусть к собственности будет принадлежать автомобиль, книга, и конь и каждый из этих функторов имеет разное количество свойств, которые принадлежат к разным типам Пролога. Тогда запись решения задачи приобретет вид
domains object=book(symbol,symbol,integer);
horse(symbol);
avto(symbol,integer).
predicates man(symbol,integer,integer,object).
ideal(symbol).
сlauses man(“Stas”,28,186,have(book(“Куприн”,”Поединок”,1902))).
man(“Vlad”,27,183,have(avto(“Volvo”,350))).
ideal(X):- man(X,A,H,have(book(“Куприн”,_,_))),A<=30,H>=180.
или
ideal(X):- man(X,A,H,have(avto(M,_))), A<=30, H>=180, M=”Volvo”.
Итоговое содержание файла main.pro имеет вид
implementmain
opencore
domains object=book(symbol,symbol,integer); horse(symbol); avto(symbol,integer).
property=have(object).
class facts
man: (symbol,integer,integer,property).
class predicates
ideal: (symbol) nondeterm(o).
clauses
man("Stas",28,186,have(book("Куприн","Поединок",1902))).
man("Vlad",27,183,have(avto("volvo",350))).
ideal(X):- man(X,A,H,have(book("Куприн",_,_))),A<=30,H>=180.
run():- console::init(),ideal(X),stdio::write(X),stdio::nl,fail.
run():- stdio::write("fail"),succeed().
end implement main
goalmainExe::run(main::run).