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

UptoLike

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

27
Получить сумму числовых элементов списка можно очевид-
ным способом:
sumList([],S).
sumList([H|T],S):-S1=S+H,sumList(T,S1).
А для иллюстрации работы со стеком применим "неочевид-
ный" прием:
predicates
sumlist(integer*,integer)
goal
L = [1,2,3,4],
sumlist(L,S),
write(S) .
clauses
sumlist([],0).
sumlist([H|T],X):-sumlist(T,S),X = S+H.
До тех пор пока не удовлетворено первое правило, Пролог
будет очищать список, сбрасывая "головы" в стек. Затем он при-
своит 0 свободной переменной, а далее будет суммировать эле-
менты стека,
присваивая значения промежуточной суммы пере-
менной X, и возвращать элементы стека в список. (По моему мне-
нию, если уж вы выбрали Пролог, не стоит жертвовать логической
ясностью ради "оптимизации".)
Встроенный предикат findall
findall собирает компоненты факта в список.
domains
фам_им_от = ф(symbol,symbol,symbol)
лист_фам_им_от = фам_им_от*
facts – f1
гриб(symbol)
язык_программирования(integer,symbol)
фио(фам_им_от)
28
predicates
собрать_фио(лист_фам_им_от)
................
goal
consult(famio.txt,f1)
%файл "famio.txt" содержит:
%фио("Фадеев","Фиктор","Петрович")
%фио("Иванов","Иван","Иванович")
...............
%фио("Гимазов","Артур","Олегович")
findall(Гриб,гриб(Гриб),Грибы),
findall(Имя_Языка,язык_программирования(_,Имя_Языка),С
писок),
собрать_фио(СписокФИО).
clauses
собрать_фио(Список):-findall(ФИО,фио(ФИО),Список).
% Список будет состоять из
[
ф("Фадеев","Фиктор","Петрович"),ф("Иванов","Иван","Ива
нович"),...]
3.5.3. Некоторые полезные программы для работы со списками
Слияние списков
Полагаем, что в базе данных facts содержаться два списка
(список1, список2), элементами которых являются целые числа.
Требуется список1 присоединить к списку2. Пусть список1 есть
[5,6,7], а список2 есть [8,9].
domains
список = integer*
facts – f1
список1(список)
список2(список)
predicates
объединить_списки(список,список,список)
     Получить сумму числовых элементов списка можно очевид-           predicates
ным способом:                                                         собрать_фио(лист_фам_им_от)
     sumList([],S).                                                   ................
     sumList([H|T],S):-S1=S+H,sumList(T,S1).                          goal
                                                                      consult(famio.txt,f1)
     А для иллюстрации работы со стеком применим "неочевид-
ный" прием:                                                           %файл "famio.txt" содержит:
     predicates                                                       %фио("Фадеев","Фиктор","Петрович")
     sumlist(integer*,integer)                                        %фио("Иванов","Иван","Иванович")
     goal                                                             ...............
     L = [1,2,3,4],                                                   %фио("Гимазов","Артур","Олегович")
     sumlist(L,S),
     write(S) .                                                       findall(Гриб,гриб(Гриб),Грибы),
     clauses                                                          findall(Имя_Языка,язык_программирования(_,Имя_Языка),С
     sumlist([],0).                                              писок),
     sumlist([H|T],X):-sumlist(T,S),X = S+H.                          собрать_фио(СписокФИО).

      До тех пор пока не удовлетворено первое правило, Пролог         clauses
будет очищать список, сбрасывая "головы" в стек. Затем он при-        собрать_фио(Список):-findall(ФИО,фио(ФИО),Список).
своит 0 свободной переменной, а далее будет суммировать эле-          % Список будет состоять из
менты стека, присваивая значения промежуточной суммы пере-            [ф("Фадеев","Фиктор","Петрович"),ф("Иванов","Иван","Ива
менной X, и возвращать элементы стека в список. (По моему мне-   нович"),...]
нию, если уж вы выбрали Пролог, не стоит жертвовать логической
ясностью ради "оптимизации".)                                     3.5.3. Некоторые полезные программы для работы со списками
                                                                        • Слияние списков
     Встроенный предикат findall
                                                                        Полагаем, что в базе данных facts содержаться два списка
     findall собирает компоненты факта в список.
                                                                 (список1, список2), элементами которых являются целые числа.
                                                                 Требуется список1 присоединить к списку2. Пусть список1 есть
     domains
                                                                 [5,6,7], а список2 есть [8,9].
     фам_им_от = ф(symbol,symbol,symbol)
     лист_фам_им_от = фам_им_от*
                                                                      domains
                                                                      список = integer*
     facts – f1
                                                                      facts – f1
     гриб(symbol)
                                                                      список1(список)
     язык_программирования(integer,symbol)
                                                                      список2(список)
     фио(фам_им_от)
                                                                      predicates
                                                                      объединить_списки(список,список,список)

                              27                                                               28