Как извлечь данные из многодоменной структуры данных в составе списка? - Prolog
Формулировка задачи:
Друзья, помогите советом. Я застрял.
Задача звучит следующим образом:
Пусть имеется список структур «кл»: [кл (а, 29, 3), кл (b, 29, 6), кл (с, 40, 2), кл (d, 35, 6), кл (e, 24, 3), кл (f, 31, 2)].
Первым аргументом каждой структуры служит имя клиента, вторым – суточный тариф, а третьим – количество дней, которое используется автомашина.
Напишите правило, позволяющее вычислить итоговую сумму оплаты, объединяющую выплаты всех клиентов, данные о которых содержатся в списке.
Я рисую код:
Дело в том, что когда я выделил один элемент из списка (структура вида human(a, 29, 3)) я не могу обратиться к ее содержимому. Просто не знаю как. Могу только в диалог вывести строчку целиком, а мне надо отдельно умножит 29 на 3. КАК? Работаю в Турбо-прологе 2
Листинг программы
- domains
- name = symbol
- price,days,summa = integer
- client = human(name,price,days)
- list = client*
- predicates
- spisok(list)
- header(list,client)
- rez
- summa(price,days,summa)
- clauses
- spisok([human(a, 29, 3),
- human(b, 29, 6),
- human(c, 40, 2),
- human(d, 35, 6),
- human(e, 24, 3),
- human(f, 31, 2)]).
- summa(P,D,S):-S=P*D, write(S).
- rez:- spisok(A),
- header(A,C),
- write("Ok",C),nl.
- header([H|T],C):-
- write(H),nl,/* в этом месте засада*/
- not(T=[]),
- header(T,C).
Решение задачи: «Как извлечь данные из многодоменной структуры данных в составе списка?»
textual
Листинг программы
- %SWI-PROLOG 7.1.26
- sum_kl([],0).
- sum_kl([kl(_,T,D)|L],R) :-
- sum_kl(L,Z),
- R is Z + (T * D).
Объяснение кода листинга программы
Код представлен в виде рекурсивной функции с названием sum_kl
, которая принимает два аргумента: список L
и число R
. Если список пуст, то рекурсия завершается и возвращается 0. В противном случае, функция рекурсивно вызывается для списка L
и переменной Z
, а затем результат суммируется с произведением T
и D
и присваивается переменной R
.
Вот список, описывающий код:
- Название функции: sum_kl
- Аргументы функции: [L, R]
- Описание рекурсивного случая: Если список пуст, то возвращается 0.
- Описание итеративного случая: Рекурсивно вызывается функция sum_kl для списка
L
и переменнойZ
. - Расчет значения переменной
R
: R = Z + (T * D) - Возвращаемое значение: R
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д