ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 9
- 10
- 11
- 12
- 13
- …
- следующая ›
- последняя »