7. Примеры программ на DECL
Пример 7.1.
Выдать студентов факультета ПМ и их группы в форме:
Студент гр. ПМ95 - Иванов Иван
Студент гр. ПМ95 - Петрова Анна
...
Студент гр. ПМ96 - Смирнов Петр
Студент гр. ПМ96 - Романова Ольга
...
Программа:
{= База знаний (БЗ) =}
ФАК(ПМ,МТУСИ)
ГР(ПМ95,ПМ)
ГР(ПМ96,ПМ)
СТУД(СТ_1,ПМ95) ФАМ(Иванов,СТ_1) ИМЯ(Иван,СТ_1)
СТУД(СТ_2,ПМ95) ФАМ(Петрова,СТ_2) ИМЯ(Анна,СТ_2)
...
BEG(/91+) {= начало программы =}
START:IF THEN T!:PROG1(ПМ) B:IN() B:HALT();
PROG1(X20):IF ГР(X10,X20) THEN T!:PROG2(X10); {= X10 это группы ПМ95, ПМ96,... =}
PROG2(X10):IF СТУД(X1,X10) THEN
B:BK() B:A("Студент гр.";,X10,"-")
T!:PROG3(X1); {= X1 это коды студентов СТ_1, СТ_2, ... группы X10 =}
{== Выдача ФИО студента X1 - СТ_1, СТ_2, ... ==}
PROG3(X1):IF ФАМ(X2,X1) THEN B:A(" ",X2);
PROG3(X1):IF ИМЯ(X4,X1) THEN B:A(" ",X4);
END(/92+) @BL(91-,92-) {= Конец программы с блокировкой зоны =}
Программа записывается в отдельный файл, например, STUD.ZZ и выполняется командой DECL_WIN.EXE STUD.ZZ. При этом БЗ может быть записана в отдельный файл, например 'KB.KN', и введена в начале программы:
START:IF THEN B:IN('KB.KN') T!:PROG1(ПМ) B:IN() B:HALT();
Если требуется выдача студентов факультета ПМ не на экран, а в файл, то стартовая продукция будет иметь вид:
START:IF THEN B:REW('STUD.RES') T!:PROG1(ПМ) B:REW()
B:EDFILE1('STUD.RES') B:HALT();
Результат записывается в файл 'STUD.RES' и выдается в редактор.
Если требуется выдача студентов в виде меню, то:
START:IF THEN B:REW(MEMORY) T!:PROG1(ПМ) B:REW()
B:MENU(1,3,"Студенты:") B:HALT();
Пример 7.2.
Использование обобщающих продукций для выдачи ФИО.
Если перед программой поместить фрагменты ФИО(ФАМ) ФИО(ИМЯ) ФИО(ОТЧ), то в предыдущем примере вместо нескольких продукций PROG3 можно воспользоваться одной:
PROG3(X1):IF ФИО(X3) X3(X4,X1) THEN B:A(" ",X4);
Переменная X3 будет последовательно означиваться X3 = ФАМ, ИМЯ, ОТЧ, и соответственно, фрагмент X3(X4,X1) будет принимать вид ФАМ(X4,X1) ИМЯ(X4,X1) ОТЧ(X4,X1) и обеспечиваться выдача ФИО.
Пример 7.3. Выдать для каждого имени - фамилии студентов.
START:IF THEN T!:PR1() B:IN() B:HALT();
{== Выбирает имя X10 - Иван, Анна, ... X1 - код студента ==}
PR1():IF ИМЯ(X10,X1) СТУД(X1,_) N:MT(X10) THEN
MT1(X10) B:BK() B:A(X10,":") T!:PR2(X10);
{== Выдает фамилии X20 студентов X1 с именем X10 ==}
PR2(X10): IF ИМЯ(X10,X1) СТУД(X1,_) ФАМ(X20,X1) THEN B:ВК() В: А("-",X20);
Предыдущий раздел|Следующий раздел