Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 23.05.2011
Сообщений: 13

Задача: "Кто с кем знаком?"

21.11.2012, 22:15. Показов 4374. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникли трудности с решением, вторая лабораторная работа по прологу, хочу разобраться. Почитал Братко, ситуация с это лабой не проясняется второй день. Пишу на GNU прологе.

Кто с кем знаком?
В одном городе живут 5 человек: Леонид, Михаил, Николай, Олег, Петр.
Их фамилии: Атаров, Бартенев, Кленов, Данилин, Иванов.
Бартенев знаком только с двумя из перечисленных.
Петр знаком со всеми, кроме одного.
Леонид знает только одного.
Данилин и Михаил незнакомы.
Николай и Иванов знакомы.
Михаил, Николай, Олег знакомы между собой.
Атаров незнаком только с одним из всех.
Только один из всех знаком с Кленовым.
Назовите имена и фамилии каждого, С кем знаком каждый из них?

Вопросы такие, не понятна сама стратегия решения, нашел решение на visual , по-моему отвратительное и длинное. До конца даже разбираться не стал. Вообще не знаю с чего начать. Как можно использовать информацию о количестве знакомых? А не только о самом факте знакомства, и нужно ли вообще? По-моему это сократило бы решение. Помогите начать, пожалуйста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2012, 22:15
Ответы с готовыми решениями:

Кто с кем катался?
Здравствуйте, помогите пожалуйста с задачами Вернулся с армии, пошел обратно в универ, закидали задачами. Заранее спасибо 1)...

Определить, кто кем может стать
нужно решение пж – Здравствуй, моя дорогая. Желаешь чистого тролльчонка, вежливого тролльчонка, грамотно говорящего тролльчонка,...

Восстановить, кто из дипломатов с кем беседует
На дипломатическом приёме находится N дипломатов, причём число N чётно. Каждый дипломат ведё беседу ровно с одним другим дипломатом....

3
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
22.11.2012, 21:48
Конечно нужно использовать информацию о количестве знакомств. Без нее вообще и нельзя решить, если конечно не жульничать, впихивая в код уже свои логические выводы.
Предложить могу два варианта.
1) Есть 5 переменных вида Имя/Фамилия/Список_знакомых
Prolog
1
2
3
solve(Леонид/Ф1/З1, Михаил/Ф2/З2, Николай/Ф3/З3, Олег/Ф4/З4, Петр/Ф5/З5):-
     permutation([Атаров, Бартенев, Кленов, Данилин, Иванов],[Ф1,Ф2,Ф3,Ф4,Ф5]),
     subset(З5,[Леонид/Ф1, Михаил/Ф3, Николай/Ф3, Олег/Ф4]),З5=[_,_,_], %Петр знаком со всеми, кроме одного
Ну и так далее, используя еще предикат member, ну и может какие-то другие. Тут есть сложность. Обязательно надо учитывать, что если А знаком с Б, то и Б знаком с А. В данной структуре это будет не очень красиво выглядеть.
2) Cписок пар вида [Имя1/Фамилия1,Имя2/Фамилия2].
Prolog
1
2
3
4
знакомы(А,Б,СписокЗнакомых):-member([А,Б],СписокЗнакомых);member([Б,А],СписокЗнакомых).
количество_знакомых(_,[],0).
количество_знакомых(X,[H|Tail],N):-знакомы(X,H),!,количество_знакомых(X,Tail,N1), N is N1+1.
количество_знакомых(X,[_|Tail],N):-количество_знакомых(X,Tail,N).
И далее
Prolog
1
2
количество_знакомых(_/Бартенев,Остальные,2).
not(member([Даниил/_,Михаил/_],Список)).
Но тут тоже проблемы есть. Например not(...) можно вызывать только когда все переменные уже приняли значение.

Более изящных способов что-то так сразу не получается придумать.
0
0 / 0 / 0
Регистрация: 23.05.2011
Сообщений: 13
30.11.2012, 20:15  [ТС]
Так, спасибо, уже лучше. Второй вариант вроде выглядит поизящнее, но тут отсечения и тонкости с not, выбрал первый. Сразу же хочу узнать, проверку вот этого
Обязательно надо учитывать, что если А знаком с Б, то и Б знаком с А.
можно делать с помощью member? Ну что-то вроде, если кто-то в друзьях у кого-то, то проверить, что и этот в друзьях у того.
Prolog
1
member(petya/_/31, З2), member("тот, у кого список друзей З2", 31)
Как-то так?
И еще, subset(З5,[Леонид/Ф1, Михаил/Ф3, Николай/Ф3, Олег/Ф4]),З5=[_,_,_], если вот такой способ определения З, то как сделать то же самое, только не по именам, а по фамилиям, ведь у нас изначально в этой структуре переменные З и Ф привязаны к именам.
Т.е. абсолютно тоже самое, только факт устанавливается по фамилии "Бартенев знаком только с двумя из перечисленных мужчин", на ум приходит что-то вроде
sublist(_/bartenev/Y, [leonid/F1, mihail/F2, nikolai/F3, oleg/F4, petr/F5]), Y = [_, _]. Но это работает не так.
0
0 / 0 / 0
Регистрация: 23.05.2011
Сообщений: 13
02.12.2012, 00:18  [ТС]
Prolog
1
2
3
4
5
6
solve([leonid/F1/Z1, mihail/F2/Z2, nikolai/F3/Z3, oleg/F4/Z4, petr/F5/Z5]):-
    permutation([atarov, bartenev, klenov, danilin, ivanov], [F1, F2, F3, F4, F5]), F3 \= ivanov,
    sublist(Z5, [leonid/F1, mihail/F2, nikolai/F3, oleg/F4]), Z5 = [_, _, _],
    sublist(Z1, [petr/F5, mihail/F2, nikolai/F3, oleg/F4]), Z1 = [_],
    member(mihail, Z3), member(mihail, Z4), member(nikolai, Z2), member(nikolai, Z4),
    member(oleg, Z2), member(oleg, Z3), F2 \= danilin, (not(member(leonid, mihail)):- F1 == danilin).
Не понимаю, как инфу с фамилиями юзать, наверное потому что не до конца разобрался, как работать с элементами структуры вида A/B/C, прощу помощи).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2012, 00:18
Помогаю со студенческими работами здесь

ManifoldJS кто знаком?
Скажите пожалуйста кто нибудь знаком с технологией ManifoldJS если да, ответьте пожалуйста на следующие вопросы. 1.Поддерживает ли он...

Кто знаком с mik-a-el?
Кто знает микаэля в жизни? Кто с ним знаком? Кто его друг? Прост интересно)

ManifoldJS кто знаком?
Скажите пожалуйста кто нибудь знаком с технологией ManifoldJS если да, ответьте пожалуйста на следующие вопросы. 1.Поддерживает ли он...

Кто знаком с Selenium
#! python 3 #kaifolog.ru вхожу в учетку, открываю страницы from selenium import webdriver from selenium.webdriver.common.keys...

Те кто знаком с parseint
Я буквально неделю тут джаваскриптю. Познакомился с parse-рами такие как parseInt() parseChar() И задачка стоит. Если я введу 42blabla...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru