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

UptoLike

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

29
goal
список1(Список1),
список2(Список2),!, % А вдруг БД пуста?!
объединить_списки(Список1,Список2,Список3);!.
clauses
объединить_списки([],L,L).
объединить_списки([H|L1],L2,[H|L3]):-
объединить_списки(L1,L2,L3).
Что будет происходить? Поскольку вначале первый список
не пуст, Пролог будет пытаться удовлетворить второе правило,
очищая первый список. Элементы первого списка пересылаются в
стек в оперативной памяти. Когда первый список окажется
пус-
тым, становится возможным третьему списку присвоить второй
список, и первое правило окажется истинным: объединить_спис-
ки([],[8,9],[8,9]).
Пролог берется за второе правило, сворачивая рекурсию.
Начиная с вершины стека, он присваивает элементы "головам"
первого и третьего списков. При этом на каждом шаге левая часть
второго правила истинна, происходит рекурсивный вызов и
так до
тех пор, пока стек не опустеет.
Сортировка списков
goal
sortL([5,4,7,6,11,9],LS)
clauses
sortL([],[]).
sortL([X|T],Sorted_list):-
sortL(T,Sorted_tail),
insert(X,Sorted_tail,Sorted_list).
insert(X,[Y|Sorted_list],[Y|Sorted_list1]):-
ask_order(X,Y),!,
insert(X,Sorted_list,Sorted_list1).
insert(X,Sorted_list,[X|Sorted_list]).
ask_order(X,Y):-X>Y.
30
3.6. Ввод и вывод
PDC Visual prolog обладает гибкой системой ввода-вывода и
манипулирования файлами.
3.6.1. Файловая система
Доступ к файлу может осуществляться в двух "модах" – би-
нарной и текстовой. Для определения вида доступа используется
специальный предикат filemode(SymbolicFileName,Mode).
Параметр Mode принимает одно из двух значений: 0 –
Binary Mode, 1 – Text Mode. Дальнейшее изложение имеет отно-
шение только к работе с файлами
в текстовой "моде".
Для того, чтобы работать с файлом на внешнем носителе,
его нужно открыть или создать. Открыть файл можно для чтения,
записи, модификации. Прежде чем это сделать, в файле
<имя_проекта>.inc в разделе global domains следует задать симво-
лические имена файлов, разделяя их точкой с запятой. (В том мес-
те, где
написано %To be edited.). Например, уже написано:
global domains
DB_SELECTOR = browselist_db % For treebrowser tool
FILE = fileselector1; fileselector2 % To be edited
Вы должны добавить Ваши имена:
global domains
DB_SELECTOR = browselist_db % For treebrowser tool
FILE = fileselector1; fileselector2; filein; filein2; fileout % To
be edited
Открыть можно практически неограниченное количество
файлов, столько, сколько позволяют установки операционной сис-
темы (но стоит ли это делать?).
Для перехода от одного открытого файла к другому (пере-
направление потоков ввода-вывода) служат предикаты readdevice
и writedevice.
Например:
....................
openread(filein,"text.txt")
openread(filein2,"text2.txt")
openwrite(fileout,"forwrite.txt")
     goal                                                               3.6. Ввод и вывод
     список1(Список1),
                                                                       PDC Visual prolog обладает гибкой системой ввода-вывода и
     список2(Список2),!, % А вдруг БД пуста?!
                                                                  манипулирования файлами.
     объединить_списки(Список1,Список2,Список3);!.
     clauses
                                                                        3.6.1. Файловая система
     объединить_списки([],L,L).
     объединить_списки([H|L1],L2,[H|L3]):-                               Доступ к файлу может осуществляться в двух "модах" – би-
     объединить_списки(L1,L2,L3).                                 нарной и текстовой. Для определения вида доступа используется
                                                                  специальный предикат filemode(SymbolicFileName,Mode).
       Что будет происходить? Поскольку вначале первый список            Параметр Mode принимает одно из двух значений: 0 –
не пуст, Пролог будет пытаться удовлетворить второе правило,      Binary Mode, 1 – Text Mode. Дальнейшее изложение имеет отно-
очищая первый список. Элементы первого списка пересылаются в      шение только к работе с файлами в текстовой "моде".
стек в оперативной памяти. Когда первый список окажется пус-             Для того, чтобы работать с файлом на внешнем носителе,
тым, становится возможным третьему списку присвоить второй        его нужно открыть или создать. Открыть файл можно для чтения,
список, и первое правило окажется истинным: объединить_спис-      записи, модификации. Прежде чем это сделать, в файле
ки([],[8,9],[8,9]).                                               <имя_проекта>.inc в разделе global domains следует задать симво-
       Пролог берется за второе правило, сворачивая рекурсию.     лические имена файлов, разделяя их точкой с запятой. (В том мес-
Начиная с вершины стека, он присваивает элементы "головам"        те, где написано %To be edited.). Например, уже написано:
первого и третьего списков. При этом на каждом шаге левая часть          global domains
второго правила истинна, происходит рекурсивный вызов и так до           DB_SELECTOR = browselist_db % For treebrowser tool
тех пор, пока стек не опустеет.                                          FILE = fileselector1; fileselector2 % To be edited
                                                                         Вы должны добавить Ваши имена:
     • Сортировка списков                                                global domains
     goal                                                                DB_SELECTOR = browselist_db % For treebrowser tool
     sortL([5,4,7,6,11,9],LS)                                            FILE = fileselector1; fileselector2; filein; filein2; fileout % To
     clauses                                                      be edited
     sortL([],[]).                                                       Открыть можно практически неограниченное количество
     sortL([X|T],Sorted_list):-                                   файлов, столько, сколько позволяют установки операционной сис-
     sortL(T,Sorted_tail),                                        темы (но стоит ли это делать?).
     insert(X,Sorted_tail,Sorted_list).                                  Для перехода от одного открытого файла к другому (пере-
     insert(X,[Y|Sorted_list],[Y|Sorted_list1]):-                 направление потоков ввода-вывода) служат предикаты readdevice
     ask_order(X,Y),!,                                            и writedevice.
     insert(X,Sorted_list,Sorted_list1).                                 Например:
     insert(X,Sorted_list,[X|Sorted_list]).                              ....................
     ask_order(X,Y):-X>Y.                                                openread(filein,"text.txt")
                                                                         openread(filein2,"text2.txt")
                                                                         openwrite(fileout,"forwrite.txt")

                                  29                                                                 30