Всем привет!
В университете задали несколько задач по прологу.
В функциональщине я слабоват и осилил набросать следующий не рабочий код:
Predicates
age(symbol, integer)
nondeterm can_drive(symbol).
one_time(какой тип/домен указать тут?)
Clauses
age(mary,16).
age(brain,17).
age(kate,15).
age(susan,15).
can_drive(kate).
can_drive(mary).
can_drive(brain).
one_time(age(X,Y)):-age(X,Y),!.
Goal
can_drive(X), age(X,Y), Y>=16.
Сама задачка звучит так:
Имеются факты:
возраст(мери,16).
возраст(брайен,16).
возраст(кейт,17).
возраст(сюзан,15).
шоферские_курсы(кейт).
шоферские_курсы(мэри).
шоферские_курсы(брайен).
один_раз(возраст(X,Y)):-возраст(X,Y),!.
Оцените полноту множества ответов и эффективность выполнения для каждого из приводимых составных запросов.
1) шоферские_курсы(X),возраст(X,Y), Y>=16. брайен,16
2) шоферские_курсы(X),!,возраст(X,Y),Y>=16.
3) шоферские_курсы(X),возраст(X,Y),!,Y>=16.
4)шоферские_курсы(X),один_раз(возраст(X,Y)), Y>=16.
Вот у меня и загвоздка в непонимании что это такое «один_раз» (one_time предикат) - может это встроенный предикат в Пролог?
Собственно вопрос: какой тип надо указать предикату one_time если он получает в кач-ве аргумента результат выполнения другого предиката
UPD: решение
domains
mydomain = age(symbol, integer)
Predicates
age(symbol, integer)
nondeterm can_drive(symbol)
one_time(mydomain)
Clauses
age(mary,16).
age(brain,17).
age(kate,15).
age(susan,15).
can_drive(kate).
can_drive(mary).
can_drive(brain).
one_time(age(X,Y)):-age(X,Y),!.
Goal
can_drive(X), age(X,Y), Y>=16.