![]() |
|
![]() ![]() ![]() |
|
Coderr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 27.1.2006 Где: Vesnet Репутация: нет Всего: 0 |
Здравствуйте! Помогите решить задачку или, хотя бы, скажите какие простейшие функции нужны для её решения.
Определите отношение подмножество(Множество, Подмножество), где Множество и Подмножество — два списка, представляющие два множества. Желательно иметь возможность использовать это отношение не только для проверки включения одного множества в другое, но и для порождения вмех возможных подмножеств заданного множества. Например: ?- подмножество([a,b,c], S). S = [a,b,c]; S = [b,c]; S = [c]; S = []; S = [a,c]; S = [a]; ... Насколько я понял, функция должна проверять вхождение Подмножества во Множество. Задачу надо сделать на SWI-Prolog. Поможете? Это сообщение отредактировал(а) Coderr - 16.11.2010, 09:24 --------------------
Кодинг - это стиль жизни! |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
как-то так PS поправил для решения второй задачи, но генерируемые подмножества с повторениями получаются. Нужно будет их проверить ещё раз include'ом. Это сообщение отредактировал(а) Cheloveck - 16.11.2010, 10:41 -------------------- ![]() |
|||
|
||||
Coderr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 27.1.2006 Где: Vesnet Репутация: нет Всего: 0 |
Что-то пошло не так... Команда ?- subset([a,b,c],S). возвращает
--------------------
Кодинг - это стиль жизни! |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
тут наоборот надо
У меня первый параметр - подмножество, а второй - множество. -------------------- ![]() |
|||
|
||||
Coderr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 27.1.2006 Где: Vesnet Репутация: нет Всего: 0 |
Действительно, спасибо!
А как сделать, чтобы рекурсия останавливалась? Если я, например, задаю команду ?- subset(S,[a,b,c]), то перебираются все возможные варианты, а потом список продолжается c [a,a,a,a] и до бесконечности. Такого быть не должно по заданию. Это сообщение отредактировал(а) Coderr - 17.11.2010, 00:08 --------------------
Кодинг - это стиль жизни! |
|||
|
||||
Coderr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 27.1.2006 Где: Vesnet Репутация: нет Всего: 0 |
Препод сказал, что это неправильно. Дал подсказку:
« Есть некие Множество и Подмножество. Чтобы определить, является ли Подмножество подмножеством Множества, надо последовательно проходить по ним и, если первые их элементы совпадают, отсекать эти первые элементы и продолжать сравнивать оставшиеся списки. Если первые элементы не совпадают, надо отсекать у Множества первый элемент и сравнивать оставшийся список с Подмножеством. На всякий случай, "отсекать" не значит, что надо использовать отношение "удалить". » Попытался сам что-то сделать, но ничего не вышло. В Прологе нет условных выражений и логического ИЛИ (по крайней мере, нам их в теории не дали). Помогите, пожалуйста. Это сообщение отредактировал(а) Coderr - 22.11.2010, 22:55 --------------------
Кодинг - это стиль жизни! |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
И, правда, работает. PS пролог изучаю пару недель, поэтому сразу не допёр. -------------------- ![]() |
|||
|
||||
Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
Тут, кстати, получаются только упорядоченные подмножества
-------------------- ![]() |
||||
|
|||||
Coderr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 27.1.2006 Где: Vesnet Репутация: нет Всего: 0 |
Эх, я был близок. Первую и третью строки я писал, но не понял как разделить дальше на условия. =)
Спасибо тебе, добрый Cheloveck, листинг работает как надо. ![]() А как работают строки
? Это сообщение отредактировал(а) Coderr - 23.11.2010, 03:42 --------------------
Кодинг - это стиль жизни! |
|||
|
||||
Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
Именно так и работают =) Добавлено через 4 минуты и 47 секунд кстати, есть изумительный предикат
после выполнения которого все достежение всех других целей будет показано подробно. Для выхода из трассировки надо сделать
-------------------- ![]() |
||||
|
|||||
Coderr |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 27.1.2006 Где: Vesnet Репутация: нет Всего: 0 |
Спасибо!
![]() --------------------
Кодинг - это стиль жизни! |
|||
|
||||
![]() ![]() ![]() |
Правила форума Prolog | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Prolog | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |