Программирование в Логике. Чанышев О.Г. - 11 стр.

UptoLike

Составители: 

21
delenie2(P1,D,Rezult).
delenie2(P1,D,Rezult):-Rezult = P1/D.
Когда какие-то значения вас не интересуют, вместо них сле-
дует ставить знак подчеркивания (указание анонимной перемен-
ной):
database – b1
некий_факт(string,integer,symbol,integer)
clauses
..,
некий_факт(A,_,_,_),
write(A),
..
3.3. Внутренняя БД Пролога
Используя аналогию с языком C, внутреннюю БД Пролога
(раздел facts, устаревшее имя раздела – database) можно рассмат-
ривать как множество массивов структур. Например, анализируя
построчно входной
текст, информацию о строках вы можете хра-
нить в структурах типа:
domains
..
number_str,type_str, length_str = integer
..
database – ab_strings
..
input_string(number_str,type_str,length_str)
..
Для размещения фактов используются встроенные предика-
ты assert, asserta, assertz (assert эквивалентно assertz). Извлекается
факт по его имени (функтору). Удаляются факты при помощи
встроеннных предикатов retract или retractall.
Рассмотрим подробнее процессы размещения и извлечения
фактов. Asserta всякий новый факт помещает в начало однимен-
ных фактов, assertz – в
конец, т. е. для работы с множеством фак-
тов как со стеком фактов следует использовать asserta, а для рабо-
22
ты с очередью фактов – assertz. Например, если во входном файле
было 1000 строк и факты размещались при помощи
assertz(input_string(NbS,TS,LS)), то используя рекурсивную
процедуру
get_all_DefStrings:-
input_string(NbS,TS,LS),!,
retractall(inp_strings(NbS,_,_)),
write(NbS,’,’),
get_all_DefStrings,!;
!.
или же более корректный с точки зрения программирования
на Прологе вариант, в котором используется бэктрекинг (да и фак-
ты не приходится удалять):
get_all_DefStrings:-
input_string(NbS,TS,LS),
write(NbS,’,’),fail.
get_all_DefStrings.
Вы получите на выходе последовательность чисел
1,2,3,..,1000.
Если использовался при загрузке предикат
asserta(input_string(NbS,TS,LS)),
то те же процедуры выдатут: 1000,999,998,..,1.
Если факты были загружены в БД в произвольном порядке,
а нужно извлечь их в определенной последовательности, то для
индексированного массива, каким является input_string, можно
поступить так:
get_all_DefStrings(I):-
input_string(I,TS,LS),!,
write(I,’,’TS,’,’,LS),nl,
Inew = I+1,
get_all_DefStrings(Inew),!;!.
Встроенный предикат save сохраняет БД во внешнем файле
(не путать с внешней БД!).
save(DosFileName) (string) – (i)
      delenie2(P1,D,Rezult).                                             ты с очередью фактов – assertz. Например, если во входном файле
      delenie2(P1,D,Rezult):-Rezult = P1/D.                              было 1000 строк и факты размещались при помощи
                                                                               assertz(input_string(NbS,TS,LS)), то используя рекурсивную
      Когда какие-то значения вас не интересуют, вместо них сле-         процедуру
дует ставить знак подчеркивания (указание анонимной перемен-                   get_all_DefStrings:-
ной):                                                                          input_string(NbS,TS,LS),!,
      database – b1                                                            retractall(inp_strings(NbS,_,_)),
      некий_факт(string,integer,symbol,integer)                                write(NbS,’,’),
      clauses                                                                  get_all_DefStrings,!;
      ..,                                                                      !.
      некий_факт(A,_,_,_),                                                     или же более корректный с точки зрения программирования
      write(A),                                                          на Прологе вариант, в котором используется бэктрекинг (да и фак-
      ..                                                                 ты не приходится удалять):
                                                                               get_all_DefStrings:-
      3.3. Внутренняя БД Пролога                                               input_string(NbS,TS,LS),
                                                                               write(NbS,’,’),fail.
      Используя аналогию с языком C, внутреннюю БД Пролога
                                                                               get_all_DefStrings.
(раздел facts, устаревшее имя раздела – database) можно рассмат-
ривать как множество массивов структур. Например, анализируя
                                                                                Вы получите на выходе последовательность           чисел
построчно входной текст, информацию о строках вы можете хра-
                                                                         1,2,3,..,1000.
нить в структурах типа:
                                                                                Если использовался при загрузке предикат
      domains
                                                                                asserta(input_string(NbS,TS,LS)),
      ..
                                                                                то те же процедуры выдатут: 1000,999,998,..,1.
      number_str,type_str, length_str = integer
      ..
                                                                              Если факты были загружены в БД в произвольном порядке,
      database – ab_strings
                                                                         а нужно извлечь их в определенной последовательности, то для
      ..
                                                                         индексированного массива, каким является input_string, можно
      input_string(number_str,type_str,length_str)
                                                                         поступить так:
      ..
                                                                              get_all_DefStrings(I):-
      Для размещения фактов используются встроенные предика-
                                                                              input_string(I,TS,LS),!,
ты assert, asserta, assertz (assert эквивалентно assertz). Извлекается
                                                                              write(I,’,’TS,’,’,LS),nl,
факт по его имени (функтору). Удаляются факты при помощи
                                                                              Inew = I+1,
встроеннных предикатов retract или retractall.
                                                                              get_all_DefStrings(Inew),!;!.
      Рассмотрим подробнее процессы размещения и извлечения
фактов. Asserta всякий новый факт помещает в начало однимен-
                                                                               Встроенный предикат save сохраняет БД во внешнем файле
ных фактов, assertz – в конец, т. е. для работы с множеством фак-
                                                                         (не путать с внешней БД!).
тов как со стеком фактов следует использовать asserta, а для рабо-
                                                                               save(DosFileName) (string) – (i)

                                 21                                                                    22