Поиск по списку структур, задача - Prolog
Формулировка задачи:
Все доброго времени суток. Задача:
Есть структура мальчик, которая выглядит так
Пирог принимает значение ест\не_ест. То есть определяем, ест ли мальчик пирог.
Есть три мальчика и каждый из них может есть, а может и не есть пирог. Нужно написать предикат, который будет подсчитывать количество нужных структур.
Сейчас код ищет только одно вхождение. Нужно как то это исправить.
Очень буду благодарен за помощь.
Результат сейчас: Кол= 1Мальчики=[человек("ваня","ест"),человек("володя","ест"),человек("миша","ест")]
А должно быть: Кол= 3Мальчики=[человек("ваня","ест"),человек("володя","ест"),человек("миша","ест")]
Листинг программы
- имя,пирог = symbol
- мальчик=человек(имя, пирог)
Листинг программы
- DOMAINS
- int = integer
- имя,пирог = symbol
- мальчик=человек(имя, пирог)
- список2 = мальчик*
- съели = пирог*
- PREDICATES
- nondeterm count_member(список2,мальчик,int,int)
- nondeterm ищем_решение(список2)
- nondeterm возможное_имя(имя)
- nondeterm один_из(пирог,съели)
- nondeterm едят(съели)
- CLAUSES
- %поиск по списку элемента
- count_member([],_,M,M):-!.
- count_member([H|T],N,K,M):-H=N,K1=K+1,!,count_member(T,N,K1,M).
- count_member([_|T],N,K,M):-count_member(T,N,K,M).
- один_из(Name,[Name | _]).
- один_из(Name,[_|Хвост]):-один_из(Name,Хвост).
- едят(Пирог):-Пирог = [ест, не_ест].
- возможное_имя(ваня).
- возможное_имя(володя).
- возможное_имя(миша).
- ищем_решение(Мальчики):- возможное_имя(Имя1),возможное_имя(Имя2),возможное_имя(Имя3),
- not(Имя1=Имя2),
- not(Имя1=Имя3),
- not(Имя3=Имя2),
- едят(Пироги),
- один_из(Пирог1,Пироги),
- один_из(Пирог2,Пироги),
- один_из(Пирог3,Пироги),
- Мальчики=[человек(Имя1, Пирог1),человек(Имя2, Пирог2),человек(Имя3, Пирог3)],
- %подсчет сколько мальчиков едят пирог
- count_member(Мальчики,человек(_,ест),0,Количество), write("Кол= ", Количество).
- GOAL
- ищем_решение(Мальчики).
Решение задачи: «Поиск по списку структур, задача»
textual
Листинг программы
- count_member(Мальчики,человек(_,ест),0,Количество),
Объяснение кода листинга программы
- Задана структура данных
человек(_,ест)
и список структур данныхМальчики
. - Переменная
Количество
инициализирована нулем. - Функция
count_member
вызывается с аргументамиМальчики
,человек(_,ест)
,0
иКоличество
. - Функция
count_member
выполняет поиск структур данныхчеловек(_,ест)
в списке структур данныхМальчики
. - При каждом обнаружении структуры данных
человек(_,ест)
в списке структур данныхМальчики
, функция увеличивает значение переменнойКоличество
на единицу. - После завершения поиска, функция возвращает значение переменной
Количество
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д