ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
