Часть полного текста документа:Агрегаты фактов 1. Списки. Если в пр-ме необходимо организовать с переменными или заранее неопределенным количеством объектов, то испол. списки. СПИСОК - упорядоченная последовательность эл-в одного типа неопределенной длины, кот м. состоять из 0 и более эл-в. Константы ,попавшие в список , записываются в [ ] и отделяются друг от друга запятыми. Исходя из определения списка, два списка , сост. из одних и тех же эл-в , но расположенных в разном порядке считаются разными. В разделе domains эл-ты списка обяз-но д.б. сопоставлены с определенным типом домена (Sp=integer*). Список в domains м.б. опосредствован через имя переменной, эл-ты кот. собираются в список. domains k_fms = string, kol = integer, Sp = kol* predicates fms ( k_fms, kd, ...) Списки состоят из заголовка ( начала списка) и захвата (окончания списка). К заголовку относится только 1-й эл-т списка, остальное - хвост. Список с нулевым количеством эл-в определяется как пустой список, он не имеет ни заголовка ни хвоста. Для работы со списками в языке имеется ряд встроенных предикатов. MEMO (, ) - где м.б. задан либо именем Sp, либо непосредственно константами, входящими в этот список. Предикат определяет принадлежность эл-та к списку. I - деление списка на голову и хвост [ Head I Tail] или [H I T] H - или переменной для обозначения заголовка T - - " - хвоста ПРИМЕР domains list=char* predicates test (List) clouses test ( ['A', 'B' , 'C', 'D'] ). goal test ([H/T]), nl, write (H) APPEND ( [ эл-ты старого списка ],[ эл-ты нового списка ],< имя нового списка > ) - из 2-х списков, старого и нового, создают III список. REVERS ( [ эл-ты стар. списка], < имя нового списка > ) - меняет последовательность эл-в на противоположную FINDALL (< имя переменной >,< формат предиката >,< имя списка >) ПРИМЕР domains post = string Kol, Cena, Sum = integer Sp = integer* ( Sp = Kol*) Kod = string predicates tmc ( P, Kol, Cena) sum ( Sp, Sum) goal write ( " Введите код"), readln ( Kod), nl, findall ( Kol, tmc ( Pos1, Kod, Kol, Cena), Sp), sum (Sp, Sum), write ( "Количество =" , Sum) clauses tmc ( " 001", "001", 45, 80) . . . sum ( [ ], 0). sum ( [ H/T ], Sum) if sum ( T, Sum1). Sum = H + Sum1. В языке имеется возможность работы с динамической базой фактов, в которой м. объединяться как однородные, так и разнородные предикаты-факторы. База фактов - нечто среднее м-у реляционной СУБД и массивом. В момент активизации все факты базы переносятся в ОЗУ с внешнего зап. устройства. Для работы с БД создается новый раздел программы, в кот. определяются прототипы предикатов-фактов, объедененных в базу. Database прототипы в этом разделе описываются по тем же правилам, что и в predicates. Раздел database записывается перед разделом predicates и предикаты, кот. ............ |