Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2018, 10:56   #1
dobry_chelovek
 
Регистрация: 06.12.2018
Сообщений: 3
По умолчанию Подмножества списка, равные заданной сумме (Prolog)

Товарищи, добрый день.
Есть задача:
Определите предикат
subsum(+Set,+Sum,?SubSet)
такой, что Set является списком чисел, SubSet - подмножеством этих чисел, а сумма чисел в SubSet равна Sum, например:
?- subsum([1,2,5,3,2],5,Sub).
Sub = [1,2,2];
Sub=[2,3];
Sub=[5];
...
Есть код, который решает задачу, но остается проблема с удалением одинаковых ответов. Как можно это организовать?
Код:
p([],0,[]). 
p([H|T],N,[H|T1]):- H =< N,N1 is N-H,p(T,N1,T1). 
p([_|T],N,T1):- p(T,N,T1).
dobry_chelovek вне форума Ответить с цитированием
Старый 06.12.2018, 12:42   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Формально это не одинаковые ответы, в них двойки - разные.
Разве условие задачи требует отсеивать эти повторения?
Боюсь, в две строчки это не выйдет.

Хотя..
Код:
subsum(Set, Sum, SubSet) :-
	subsum(Set, Sum, [], SubSet).

subsum([], 0, _, []).
subsum([H|T], N, Skip, [H|T1]) :-
	not(member(H, Skip)),
	H =< N,
	N1 is N-H,
	subsum(T, N1, Skip, T1).
subsum([H|T], N, Skip, T1) :-
	subsum(T, N, [H|Skip], T1).
Код:
?- subsum([1,2,5,3,2], 5, Sub).
Sub = [1, 2, 2] ;
Sub = [2, 3] ;
Sub = [5] ;
false.

Последний раз редактировалось Black Fregat; 06.12.2018 в 12:55.
Black Fregat вне форума Ответить с цитированием
Старый 06.12.2018, 18:21   #3
dobry_chelovek
 
Регистрация: 06.12.2018
Сообщений: 3
По умолчанию

Спасибо. Я же правильно понимаю, что таким образом мы вносим по очереди в список Skip те элементы, для которых все варианты в дальнейшем исчерпаны и для которых просмотр не имеет смысла? А каким образом в SWI Prolog можно вызывать ответы до false не пользуясь точкой с запятой или кнопкой Next в онлайн версии?
dobry_chelovek вне форума Ответить с цитированием
Старый 07.12.2018, 01:50   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от dobry_chelovek Посмотреть сообщение
для которых просмотр не имеет смысла?
Точнее - для которых выбор будет вести к повторам.
Повторы возникают из-за дублей одинаковых элементов в списке.
Смысл решения в том, что мы перестаём включть в список элементы, хотя бы один раз пропущенные

Цитата:
Сообщение от dobry_chelovek Посмотреть сообщение
каким образом в SWI Prolog можно вызывать ответы до false не пользуясь точкой с запятой или кнопкой Next
Не знаю. Можно смоделировать:
Код:
 ?- subsum([1,2,5,3,2], 5, Sub), write(Sub), nl, fail.
[1,2,2]
[2,3]
[5]
false.
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найдите трехзначные числа, равные сумме кубов своих цифр. Подсчет суммы кубов организовать в виде функции. Julia_Sv Паскаль, Turbo Pascal, PascalABC.NET 0 02.04.2016 13:32
Списковый алгоритм решения задачи о сумме подмножества Maria_Z Помощь студентам 0 27.05.2015 18:28
Prolog. Клонирование списка. java_shkiper Помощь студентам 5 13.10.2013 20:57
Prolog.Сортировка списка KLOP Помощь студентам 3 23.12.2012 22:35
Задача на Pascal - вывестикомбинации (подмножества) цифр заданной длины aless23 Паскаль, Turbo Pascal, PascalABC.NET 4 03.12.2012 09:05