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

UptoLike

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

23
save(DosFileName,InternalDatabaseName)
(string,DatabaseName) – (i,i)
Встроенный предикат consult загружает БД, сохраненную
предикатом save, из файла в память.
consult(DosFileName) (string) – (i)
consult(DosFileName,InternalDatabaseName)
(string,InternalDatabaseName) – (i,i)
Примеры:
save("stringDB.dba",ab_strings)
consult("stringDB.dba",ab_strings)
Только одна БД в программе может быть неименованной.
Все остальные должны иметь имя.
Вы можете сформировать факты БД в программе, написан-
ной на любом другом языке, и записать их в файл или сформиро-
вать "вручную" при помощи текстового редактора, затем загрузить
в память в программе на Прологе при помощи consult.
3.4. Обработка
условий и организация циклов в Прологе
Два встроенных предиката, очень полезных для обработки
условий и организации циклов:
1. Предикат fail искусственно порождает неуспех.
2. Предикат cut (или !) предотвращает бэктрекинг:
p:-p1,p2,!,p3,.. – если достигнуты цели p1 и p2, бэктрениг не
осуществляется.
3.4.1. Обработка условия
Пусть a – предикат, который может быть либо успешным,
либо нет. В случае успеха мы хотим
выполнить предикат u, в об-
ратном случаепредикат f.
p:-a,!,u;f.
Можно и так (в случае неуспеха выполняется второе прави-
ло для p):
p:-a,!,u.
p:-f.
24
Пример:
p(A,C,Dplus):-A>=C,!,Dplus=A-C;Dplus=C-A.
Или:
p(A,C,Dplus):-A>=C,!,Dplus=A-C.
p(A,C,Dplus):-Dplus=C-A.
Конечно, наиболее простое решение:
p(A,C,Dplus):-Z:=A-C, Dplus=abs(Z), где abs – встроенная
функция.
Если в нашем примере со строками требуется получить все
номера строк с длиной не более 45, тогда процедура, решающая
эту задачу, будет такой:
get_all_DefStrings:-
input_string(NbS,TS,LS),
LS< = 45,
write(NbS,’,’), fail.
get_all_DefStrings. % или get_all_DefStrings:-!.
3.4.2. Использование предиката типа repeat
Пусть требуется в рамках одного правила предиката pravilo
выполнить некоторое множество заведомо успешных предикатов
,
после чего выполнять некоторое другое множество предикатов, до
тех пор, пока справедливо некоторое условие.
Первую и вторую группы предикатов можно, очевидно, обо-
значить одним предикатом, p1 и p2 соответственно. Пусть
p_control – предикат, проверяющий условие, а предикат repeat (ко-
торый может, очевидно, иметь любое другое имя) записывается в
виде следующих двух правил:
repeat.
repeat:-repeat.
Тогда:
pravilo:-p1,repeat,p2,p_control.
Предикат p1
выполнится один раз, предикат же p2 будет
выполняться до тех пор, пока p_control неуспешен.
     save(DosFileName,InternalDatabaseName)                               Пример:
     (string,DatabaseName) – (i,i)                                        p(A,C,Dplus):-A>=C,!,Dplus=A-C;Dplus=C-A.

       Встроенный предикат consult загружает БД, сохраненную              Или:
предикатом save, из файла в память.                                       p(A,C,Dplus):-A>=C,!,Dplus=A-C.
       consult(DosFileName) (string) – (i)                                p(A,C,Dplus):-Dplus=C-A.
       consult(DosFileName,InternalDatabaseName)
(string,InternalDatabaseName) – (i,i)                                     Конечно, наиболее простое решение:
                                                                          p(A,C,Dplus):-Z:=A-C, Dplus=abs(Z), где abs – встроенная
     Примеры:                                                        функция.
     save("stringDB.dba",ab_strings)
     consult("stringDB.dba",ab_strings)                                    Если в нашем примере со строками требуется получить все
                                                                     номера строк с длиной не более 45, тогда процедура, решающая
      Только одна БД в программе может быть неименованной.
                                                                     эту задачу, будет такой:
Все остальные должны иметь имя.
                                                                           get_all_DefStrings:-
      Вы можете сформировать факты БД в программе, написан-
                                                                           input_string(NbS,TS,LS),
ной на любом другом языке, и записать их в файл или сформиро-
                                                                           LS< = 45,
вать "вручную" при помощи текстового редактора, затем загрузить
                                                                           write(NbS,’,’), fail.
в память в программе на Прологе при помощи consult.
                                                                           get_all_DefStrings. % или get_all_DefStrings:-!.
     3.4. Обработка условий и организация циклов в Прологе
                                                                          3.4.2. Использование предиката типа repeat
     Два встроенных предиката, очень полезных для обработки
                                                                           Пусть требуется в рамках одного правила предиката pravilo
условий и организации циклов:
                                                                     выполнить некоторое множество заведомо успешных предикатов,
     1. Предикат fail искусственно порождает неуспех.
                                                                     после чего выполнять некоторое другое множество предикатов, до
     2. Предикат cut (или !) предотвращает бэктрекинг:
                                                                     тех пор, пока справедливо некоторое условие.
     p:-p1,p2,!,p3,.. – если достигнуты цели p1 и p2, бэктрениг не
                                                                           Первую и вторую группы предикатов можно, очевидно, обо-
осуществляется.
                                                                     значить одним предикатом, p1 и p2 соответственно. Пусть
                                                                     p_control – предикат, проверяющий условие, а предикат repeat (ко-
     3.4.1. Обработка условия
                                                                     торый может, очевидно, иметь любое другое имя) записывается в
      Пусть a – предикат, который может быть либо успешным,          виде следующих двух правил:
либо нет. В случае успеха мы хотим выполнить предикат u, в об-             repeat.
ратном случае – предикат f.                                                repeat:-repeat.
      p:-a,!,u;f.                                                          Тогда:
      Можно и так (в случае неуспеха выполняется второе прави-             pravilo:-p1,repeat,p2,p_control.
ло для p):
      p:-a,!,u.                                                           Предикат p1 выполнится один раз, предикат же p2 будет
      p:-f.                                                          выполняться до тех пор, пока p_control неуспешен.

                                23                                                                  24