скачать книгу бесплатно
2.1.3. Некоторые простые примеры логического порождающего программирования на базе макромодулей
1. Пусть макромодуль генерирует серию заголовков цикла – в этом случае используется П-блок с опущенными префиксом и скобками. Далее приведен пример, содержащий соответствующий макромодуль big_loop, который вызывается для генерации тройного вложенного цикла (i = 0..2, j = 0..3, k = 0..4).
#include <iostream>
using namespace std;
#def_module () big_loop (Vars, Lows, Highs) {
@goal:-brackets_off.
@loop ([], [], []):-!.
@loop ([V|VT], [L|LT], [H|HT]):-
write (’for (int»),write (V),write (»=»),write (L),write (»;»),
write (V),write (»<=»),write (H),write (»;»),
write (V),write (»++)»),
loop (VT, LT, HT).
@goal:-loop (Vars, Lows, Highs).
};
int main () {
big_loop ([’i’,’j’,’k’], [0,0,0], [2,3,4])
cout <<«1»;
cout <<endl;
return 0;
}
2. Рассмотрим применение макромодуля tree_node для формирования декларацию типа элемента n-арного дерева (n> = 2).
#def_module (struct) tree_node (ID, Type, Name, Arity) {
@goal:-brackets_off.
@goal:-write (ID). {
@goal:-write (Type),write (»»),write (Name),write (»;»).