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