Модульные проекты применяются для упрощения программирования.
Рассмотрим пример программы, которая анализирует список персон. Для персон задаются имя и возраст. Сначала в консоль выводится список имен, затем список возрастов и в конце средний возраст персон.
Для удобства было бы неплохо отделить объявление фактов, предикатов и т.д., которые касаются персон в другой модуль.
Для того чтобы создать модуль, следует выделить корень дерева проекта и выбрать команду (всплывающего) меню New In New Package. В открывшемся диалоговом окне Create Project Item необходимо выбрать в левом поле раздел Class, убрать флажок из поля Create Interface, ввести в поле Name имя модуля, в нашем случае «person», и нажать на кнопку Create.
После чего появится новая папка в нашем проекте «person», в которой мы будем изменять файлы person.pro и person.cl.
В файле person.cl описан класс, через который мы будем обращаться в главном файле проекта main.pro, поэтому добавим в него объявление предикатов:
class person
open core
domains
name = string.
age = integer.
age_list = integer_list.
predicates
person : (name, age) multi (o,o). % Студенты
sumlist : (age_list, age, integer) procedure(i,o,o). % Список их данных
end class person
Теперь перейдем к определению этих предикатов в файле person.pro:
implement person
open core
clauses
% Пустой список, сумма возрастов Sum=0 и число студентов N=0
sumlist([],0,0).
sumlist([H|T], Sum, N):-
sumlist(T, S1,N1), % Вызов для очередного факта
Sum=H+S1, % Копим сумму
N=1+N1. % увеличиваем N на 1
% Список фактов
person("Иванов", 42).
person("Петров", 36).
person("Сидоров", 36).
end implement person
И завершающим этапом будет добавление функционала в главный файл проекта main.pro:
implement main
open core, console, person
clauses
run():-
init(),
write("Список студентов: "),nl,
L1 = [ Name ||person(Name, _)], % Получить список
write(L1),nl,nl,
write("Их возраст: "),nl,
L2 = [ Age || person(_, Age)], % Получить список возрастов
write(L2),nl,nl,
% Получить из списка L2 сумму возрастов Sum и число студентов N
sumlist(L2, Sum, N),
Ave = Sum/N, % Средний возраст студентов
write("Средний возраст = ", Ave),nl,nl,
write("Нажмите Enter"),
_= readLine().
end implement main
goal
mainExe::run(main::run).
Как видно, для обращения к предикатам класса person
достаточно добавить его имя в строку open core, console
.