[Закрыть]
 
popoff.donetsk.ua
Сны видят все, но не все в это время спят.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Функциональное и логическое программирование - Задача на Прологе. Найти в списке элементы и вывести если встречаются ровно 3 раза

Задача на Прологе. Найти в списке элементы и вывести если встречаются ровно 3 раза

форумы popoff.donetsk.ua
Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Автор Сообщение
bond89
Андрей
Июн, 2008
Сообщений: 2
bond89 url://forum.message:2518
Задача на Прологе. Найти в списке элементы и вывести если встречаются ровно 3 раза

Вывести на экран элементы списка встречающегося в нём ровно 3 раза, если таких элементов нет вывести сообщение.

domains
   list=integer*
predicates
   p(list)  
clauses
   p([]).  
   p([H|T]):-
   p(T),          
      p1(исходный список),
     а дальше мозги не понимают

   ...:-write (H).
   
goal
   p([1,2,3,4,5])

popoff
Yuri
Июл, 2004
Сообщений: 923
popoff url://forum.message:2520

А в чём же вопрос?

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
bond89
Андрей
Июн, 2008
Сообщений: 2
bond89 url://forum.message:2521

Вопрос собственно в алгоритме, очнее в реализации. Не удаётся перебирать элементы 2й раз для сравнения.

popoff
Yuri
Июл, 2004
Сообщений: 923
popoff url://forum.message:2522

bond89,
Сейчас Вас вопрос сформулирован так, что единственный способ на него ответить - это написать за Вас программный код, который решает Вашу задачу. Но я этого не делаю, в соответствие с правилами этого форума.

Сформулируйте Ваш вопрос так, чтобы на него можно было ответить.

~~~~~ 15 Июн 2008, 20:00, спустя 7 минут ~~~~~

Создайте для себя вспомогательный предикат, который будет принимать на вход два списка.
Назовём его, к примеру, count_add
В первом списке будет элемент, во втором - сколько раз этот элемент встретился (счётчик).
Например, для списка [a,b,c,b,a,b] это будет два таких списка:
[a,b,c]
[2,3,1]
Этот вспомогательный предикат должен принимать на вход эти два списка и элемент, и должен либо увеличивать счётчик, соответствующий заданному элементу, либо добавлять новый элемент в оба списка (счётчик при этом будет равен 1).

После этого сделайте предикат, который будет формировать эти два списка из исходного списка. Назовём его, к примеру, count_all(). Этот предикат будет ходить по Вашему исходному списку и для каждого элемента исходного списка вызывать count_add().

После этого создайте ещё один предикат, который будет принимать на вход эти два списка и возвращать третий список, в котором есть только такие элементы исходного списка, которые встретились ровно три раза. Пусть, этот предикат будет называться count_search().

Ну и в завершение всего Вам потребуется Ваш целевой предикат, который будет это всё дело вызывать. Назовём его count_target(). То есть, он сначала сформирует те два списка, о которых я говорил в самом начале - для этого он вызовет предикат count_all(), и после этого сформирует нужный Вам результат - для этого он вызовет count_search().

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
Программное обеспечение любой сложности
koins.com.ua