Пример 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).