Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 28

Задача студенческий ансамбль

04.12.2014, 22:32. Показов 1466. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Застрял с задачкой. При данной реализации кода пролог выдает ответ, что решений нет.

Четыре студента разных факультетов организовали инструментальный ансамбль. Михаил играет в нем на саксофоне. Пианист учится на физическом факультете. Ударника зовут не Валентин, а студента географического факультета – не Леонид. Михаил учится не на историческом факультете. Андрей не пианист и не биолог. Валентин учится не на физическом факультете, а ударник – не на историческом. Леонид играет не на контрабасе. На каком инструменте играет и на каком факультете учится Валентин?

Правильный ответ знаю, т.к. прорешал вручную. Должно выйти, что валентин историк и играет на контрабасе.

Обратил внимание, что "No Solutions" появляется, когда пытаюсь описать отрицания. К примеру такое:

Prolog
1
2
 %Михаил учится не на историческом факультете.
 зовут(Студент1, михаил), учится(Студент1, Факультет_студента1), not(Факультет_студента1 = исторический)
Программа пишется на Visual Prolog 5.2. Подскажите, как нужно подправить код, чтобы все встало на свои места?

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
DOMAINS
    имя, факультет, инструмент = symbol
    студент = человек(имя, факультет, инструмент)
    список_студентов = студент*
    
PREDICATES
    nondeterm входит_в(студент, список_студентов)
    nondeterm возможное_имя(имя)
    nondeterm возможный_факультет(факультет)
    nondeterm возможный_инструмент(инструмент)
    
    зовут(студент, имя)
    учится(студент, факультет)
    играет(студент, инструмент)
    
    nondeterm поиск_решения(список_студентов)
    
CLAUSES
    /* Проверка, что студент входит в состав ансамбля. */
    входит_в(Голова,[Голова|_]).
    входит_в(Голова,[_|Хвост]):- входит_в(Голова,Хвост).
    
    /* Список возможных участников. */
    возможное_имя(михаил).
    возможное_имя(валентин).
    возможное_имя(леонид).
    возможное_имя(андрей).
    
    /* Список факультетов. */
    возможный_факультет(физический).
    возможный_факультет(географический).
    возможный_факультет(исторический).
    возможный_факультет(биологический).
    
    /* Список инструментов в ансамбле. */
    возможный_инструмент(саксофон).
    возможный_инструмент(барабаны).
    возможный_инструмент(пианино).
    возможный_инструмент(контрабас).
    
    /* Из списка студентов извлекаем необходимые данные. */
    зовут(человек(Имя,_,_), Имя).
    учится(человек(_,Факультет,_), Факультет).
    играет(человек(_,_,Инструмент), Инструмент).
 
    /* Генерация гипотезы */
    поиск_решения(Студенты):- 
        возможное_имя(Имя1),возможное_имя(Имя2),возможное_имя(Имя3), возможное_имя(Имя4),
            возможный_факультет(Факультет1), возможный_факультет(Факультет2), 
                возможный_факультет(Факультет3), возможный_факультет(Факультет4), 
            возможный_инструмент(Инструмент1), возможный_инструмент(Инструмент2),
                возможный_инструмент(Инструмент3), возможный_инструмент(Инструмент4),
            
        not(Имя1 = Имя2), not(Имя1 = Имя3), not(Имя1 = Имя4), 
            not(Имя2 = Имя3), not(Имя2 = Имя4),
                not(Имя3 = Имя4),
            
        not(Факультет1 = Факультет2), not(Факультет1 = Факультет3), not(Факультет1 = Факультет4),
            not(Факультет2 = Факультет3), not(Факультет2 = Факультет4),
                not(Факультет3 = Факультет4),
                
        not(Инструмент1 = Инструмент2), not(Инструмент1 = Инструмент3), not(Инструмент1 = Инструмент4),
            not(Инструмент2 = Инструмент3), not(Инструмент2 = Инструмент4),
                not(Инструмент3 = Инструмент4),
        
        Студенты = [человек(Имя1, Факультет1, Инструмент1), человек(Имя2, Факультет2, Инструмент2),
                человек(Имя3, Факультет3, Инструмент3), человек(Имя4, Факультет4, Инструмент4)],
                
    /* Проверка гипотезы */
    
    /* Михаил играет в нем на саксофоне. Михаил учится не на историческом факультете. */
    зовут(Студент1, михаил), играет(Студент1, саксофон), 
        учится(Студент1, Факультет_студента1), not(Факультет_студента1 = исторический),
    
    /* Андрей не пианист и не биолог. */
    зовут(Студент2, андрей), играет(Студент2, Инструмент_студента2), not(Инструмент_студента2 = пианино),
        учится(Студент2, Факультет_студента2), not(Факультет_студента2 = биологический),
        
    /* Леонид играет не на контрабасе и не географ. */
    зовут(Студент3, леонид), играет(Студент3, Инструмент_студента3), not(Инструмент_студента3 = контрабас),
        учится(Студент3, Факультет_студента3), not(Факультет_студента3 = географический),
        
    /* Ударника зовут не Валентин. Валентин учится не на физическом факультете */
    зовут(Студент4, валентин), играет(Студент4, Инструмент_студента4), not(Инструмент_студента4 = барабаны),
        учится(Студент4, Факультет_студента4), not(Факультет_студента4 = физический),
        
    /* Пианист учится на физическом факультете.  */
    зовут(Некто_Студент,_), играет(Некто_студент, пианино),  
        учится(Некто_Студент, физический), 
        
    /* Ударник - не на историческом. */
    зовут(Некто_Студент2,_), играет(Некто_студент2, ударник),  
        учится(Некто_Студент2, Факультет_Некто), not(Факультет_Некто = исторический). 
        
GOAL
    /* На чем играет Валентин? */
    поиск_решения(Студенты), входит_в(Валентин, Студенты), зовут(Валентин, валентин), играет(Валентин, Валентин_играет_на);
    
    /* На каком факультете учится Валентин? */
    поиск_решения(Студенты), входит_в(Валентин, Студенты), зовут(Валентин, валентин),
        учится(Валентин, Валентин_учится_на).
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2014, 22:32
Ответы с готовыми решениями:

Задача "Студенческий автобус"
Здравствуйте. Помогите, пожалуйста, решить задачу (условие во вложениях) Мои индусские наброски вот: #include "stdafx.h" ...

Ансамбль реализаций случайного процесса
Прошу помочь. Как в матлабе , можно сделать реализацию случайного процесса? У меня есть случайный процесс, понятное дело, он каждый раз...

Ансамбль А содержит 16 равновероятных сообщений. Определить количество информации
Ансамбль А содержит 16 равновероятных сообщений. Определить количество информации, которую содержит каждое такое сообщение.

2
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
05.12.2014, 03:37
Лучший ответ Сообщение было отмечено Slayerz как решение

Решение

Основная ошибка вот в чём. Смотрите, в 66 строке появился список студентов. Это правильно. А вот в 72 строке у Вас появился совершенно левый Студент1. Он никак к этому списку не привязан. Имя Вы ему дали, инструмент Вы ему дали, а факультет у него остался несвязанным. Поэтому отрицание и не сработает. В цели вы студента привязываете к списку через входит_в(), здесь везде тоже надо.

Вообще, часть правила про несчастного Студента1 можно написать гораздо короче:
Prolog
1
2
входит_в(человек("михаил", Факультет_Михаила, "саксофон"), Студенты),  
Факультет_Михаила <> "исторический",
Кстати, очень рекомендую строковые константы в пятерке брать в кавычки. Не очень адекватно работает она со строковыми константами без кавычек. Возможны трудноуловимые глюки.

Когда Вы это исправите, решения всё равно не будет, потому что у Вас просто описка в 92 строке. Инструмент не так называется.

Когда Вы и это исправите, Вам вывалится море решений. Это потому, что 4 студента в списке могут идти в разном порядке, а Ваша программа этого не учитывает. Значит, каждое решение превращается в 24. Лично я обычно какую-то характеристику, например, имена, просто прописываю в списке явно. Но чтобы поменьше менять в Вашей программе, вынесите заполнение имен вместе с их проверкой в самое начало предиката и поставьте отсечение:
Prolog
1
2
3
4
5
    поиск_решения(Студенты):- 
        возможное_имя(Имя1),возможное_имя(Имя2),возможное_имя(Имя3), возможное_имя(Имя4),
        not(Имя1 = Имя2), not(Имя1 = Имя3), not(Имя1 = Имя4), 
            not(Имя2 = Имя3), not(Имя2 = Имя4),
                not(Имя3 = Имя4), !,
Добавлено через 2 минуты
Цитата Сообщение от Slayerz Посмотреть сообщение
Должно выйти, что валентин историк и играет на контрабасе.
Таки да.
1
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 28
05.12.2014, 23:25  [ТС]
Огромное спасибо за помощь! Ваша подсказка помогла разобраться с вопросом, успешно защитил задачу Для "будущих поколений" оставляю рабочий код.

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
DOMAINS
    имя, факультет, инструмент = symbol
    студент = человек(имя, факультет, инструмент)
    список_студентов = студент*
    
PREDICATES
    nondeterm входит_в(студент, список_студентов)
    nondeterm возможное_имя(имя)
    nondeterm возможный_факультет(факультет)
    nondeterm возможный_инструмент(инструмент) 
    nondeterm поиск_решения(список_студентов)
    
CLAUSES
    /* Проверка, что студент входит в состав ансамбля. */
    входит_в(Голова,[Голова|_]).
    входит_в(Голова,[_|Хвост]):- входит_в(Голова,Хвост).
    
    /* Список возможных участников. */
    возможное_имя(михаил).
    возможное_имя(валентин).
    возможное_имя(леонид).
    возможное_имя(андрей).
    
    /* Список факультетов. */
    возможный_факультет(физический).
    возможный_факультет(географический).
    возможный_факультет(исторический).
    возможный_факультет(биологический).
    
    /* Список инструментов в ансамбле. */
    возможный_инструмент(саксофон).
    возможный_инструмент(барабаны).
    возможный_инструмент(пианино).
    возможный_инструмент(контрабас).
 
    /* Генерация гипотезы */
    поиск_решения(Студенты):- 
        возможное_имя(Имя1),возможное_имя(Имя2),возможное_имя(Имя3), возможное_имя(Имя4),       
            not(Имя1 = Имя2), not(Имя1 = Имя3), not(Имя1 = Имя4), 
                not(Имя2 = Имя3), not(Имя2 = Имя4),
                    not(Имя3 = Имя4), !,
        
        возможный_факультет(Факультет1), возможный_факультет(Факультет2), 
            возможный_факультет(Факультет3), возможный_факультет(Факультет4), 
            not(Факультет1 = Факультет2), not(Факультет1 = Факультет3), not(Факультет1 = Факультет4),
                not(Факультет2 = Факультет3), not(Факультет2 = Факультет4),
                    not(Факультет3 = Факультет4),
            
        возможный_инструмент(Инструмент1), возможный_инструмент(Инструмент2),
            возможный_инструмент(Инструмент3), возможный_инструмент(Инструмент4),
            not(Инструмент1 = Инструмент2), not(Инструмент1 = Инструмент3), not(Инструмент1 = Инструмент4),
                not(Инструмент2 = Инструмент3), not(Инструмент2 = Инструмент4),
                    not(Инструмент3 = Инструмент4),
        
        Студенты = [человек(Имя1, Факультет1, Инструмент1), человек(Имя2, Факультет2, Инструмент2),
                человек(Имя3, Факультет3, Инструмент3), человек(Имя4, Факультет4, Инструмент4)],
                
    /* Проверка гипотезы */ 
    /* Михаил играет в нем на саксофоне. Михаил учится не на историческом факультете. */
    входит_в(человек(михаил, Факультет_Михаила, саксофон), Студенты), not(Факультет_Михаила = исторический),
    
    /* Андрей не пианист и не биолог. */
    входит_в(человек(андрей, Факультет_Андрея, Инструмент_Андрея), Студенты), not(Факультет_Андрея = биологический), not(Инструмент_Андрея = пианино),
    
    /* Леонид не играет на контрабасе и не географ. */
    входит_в(человек(леонид, Факультет_Леонида, Инструмент_Леонида), Студенты), not(Факультет_Леонида = географический), not(Инструмент_Леонида = контрабас),
    
    /* Ударника зовут не Валентин. Валентин учится не на физическом факультете */
    входит_в(человек(валентин, Факультет_Валентина, Инструмент_Валентина), Студенты), not(Факультет_Валентина = физический), not(Инструмент_Валентина = барабаны),
    
    /* Пианист учится на физическом факультете. */
    входит_в(человек(_, физический, пианино), Студенты),
    
    /* Ударник - не на историческом. */
    входит_в(человек(_, Факультет_студента, барабаны), Студенты), not(Факультет_студента = исторический).
        
GOAL
    /* На каком инструменте играет и на каком факультете учится Валентин? */
    поиск_решения(Студенты), входит_в(человек(валентин, Валентин_учится_на_факультете, Валентин_играет_на_инструменте), Студенты).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.12.2014, 23:25
Помогаю со студенческими работами здесь

Студенческий бюджетный выбор
Студент, денег, нет, поэтому приходится делать горький выбор из двух зол: Первый вариант: Дешево, с рук, останется несколько тысяч...

React-native студенческий проект
Всем привет! Ищу разработчика для совместной разработки нашего мобильного приложения (можно сказать студенческий проект). Пишите кому...

Студенческий журнал (УДАЛИТЬ элемент)
Происходит считывание группы и данных о студентах (фамилия, имя, дата рождения), далее мне нужно удалить одного студента (чей номер...

Олимпиадная задача по программированию. PascalABC.NET. Задача L. Переключение между окнами
Когда пользователь работает в операционной системе Winux, у него часто запущено несколько приложений. Каждое из приложений работает в...

Васильев C# Глава 7 задача 8 (Просьба объяснить формулировку(задача внутри)
Текст задачи Напишите программу с классом, у которого есть текстовое поле. Значение текстовому полю присваивается при создании объекта...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru