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

Соревнования по плаванию. Кто на какое место претендует? [visual prolog]

09.05.2011, 00:35. Показов 2367. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый всем день.
у меня есть такая задачка:

Соревнования по Плаванию
Перед соревнованием по плаванию каждого из четырех участников А, Б, В, Г спросили, на какое место он претендует. А сказал, что планирует быть первым, Б обещал не быть четвертым, В выразил надежду не быть четвертым и первым, Г сказал, что будет четвертым. После заплыва оказалось, что только один ошибся. Кто ошибся?

для ее решения написала вот такой код:

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
DOMAINS
    пловец = пловец(имя,место)
    имя,место=symbol    
    список_мест = место*
    список_имен = имя*
    список_пловцов = пловец*
    
PREDICATES
    nondeterm один_из(место,список_мест)
    nondeterm один_из(имя,список_имен)
    nondeterm один_из(пловец,список_пловцов)
    nondeterm сказал(пловец,пловец)
    nondeterm проверка_высказываний_и(пловец,пловец)
    nondeterm проверка_высказываний_л(пловец,пловец)
    nondeterm кто_ошибся(пловец)
 
CLAUSES
    один_из(Что,[Что|_]).
    один_из(Что,[_|Хвост]):-один_из(Что,Хвост).
 
    сказал(пловец(а,_),пловец(а,Место)) :- Место = первый.  
    сказал(пловец(б,_),пловец(б,Место)) :- Место = четвертый.    
    сказал(пловец(в,_),пловец(в,Место)) :- not(Место = четвертый).   
    сказал(пловец(г,_),пловец(г,Место)) :- not(Место = первый),not(Место = четвертый).
    
    проверка_высказываний_л(Пловец,Ошибся1) :- Пловец = пловец(Имя1,М1),Ошибся1 = пловец(Имя2,М2),
        сказал(Пловец,Ошибся1),Имя1=Имя2,not(М1=М2).  
    проверка_высказываний_и(Пловец,Ошибся1) :- Пловец = пловец(Имя1,М1),Ошибся1 = пловец(Имя2,М2),
        сказал(Пловец,Ошибся1),Имя1=Имя2,М1=М2.       
 
    кто_ошибся(Ошибся) :- 
        ПловецА = пловец(ИмяА,МестоА),
        один_из(ИмяА,[а,б,в,г]),
        один_из(МестоА,[первый,второй,третий,четвертый]),
        ПловецБ = пловец(ИмяБ,МестоБ),
 
        один_из(ИмяБ,[а,б,в,г]),
        один_из(МестоБ,[первый,второй,третий,четвертый]),
        not(ИмяБ = ИмяА),not(МестоБ = МестоА),
        
        ПловецВ = пловец(ИмяВ,МестоВ),
        один_из(ИмяВ,[а,б,в,г]),
        один_из(МестоВ,[первый,второй,третий,четвертый]),
        not(ИмяВ = ИмяА),not(ИмяВ = ИмяБ),
        not(МестоВ = МестоА),not(МестоВ = МестоБ),  
    
        ПловецГ = пловец(ИмяГ,МестоГ),
        один_из(ИмяГ,[а,б,в,г]),
        один_из(МестоГ,[первый,второй,третий,четвертый]),
        not(ИмяГ = ИмяА),not(ИмяГ = ИмяБ),not(ИмяГ = ИмяВ),
        not(МестоГ = МестоА),not(МестоГ = МестоБ),not(МестоГ = МестоВ),
        
        Пловцы = [ПловецА,ПловецБ,ПловецВ,ПловецГ],
        один_из(Ошибся,Пловцы),
        проверка_высказываний_и(ПловецА,Ошибся),
        проверка_высказываний_и(ПловецБ,Ошибся),
        проверка_высказываний_и(ПловецВ,Ошибся),
        проверка_высказываний_л(ПловецГ,Ошибся).
 
GOAL
    кто_ошибся(Ошибся).
Но к сожалению программа выдает решение, что решения нет. Хотя оно должно быть и вроде, как я сама решила задачу, ошибся А. Не могу понять в чем ошибка, может подскажите?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.05.2011, 00:35
Ответы с готовыми решениями:

Соревнования по плаванию. Кто на какое место претендует? [visual prolog]
Перед соревнованием по плаванию каждого из четырех участников Алексея, Бориса, Виктора, Григория спросили, на какое место он претендует....

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

Visual prolog 5.2 Кто может сказать что за цикл используется?
Всем привет. Если не трудно подскажите пожалуйста что за цикл здесь используется: predicates sp_st(SLIST,INTEGER,INTEGER) clauses ...

6
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
09.05.2011, 01:01
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
DOMAINS
        plovec = plovec(imja,mesto)
        imja,mesto=symbol        
        spisok_mest = mesto*
        spisok_imen = imja*
        spisok_plovcov = plovec*
        
PREDICATES
        nondeterm odin_iz(mesto,spisok_mest)
        nondeterm odin_iz(imja,spisok_imen)
        %nondeterm odin_iz(plovec,spisok_plovcov)
        nondeterm skazal(plovec)
        nondeterm proverka_vyskazyvanij(plovec,imja)
        nondeterm kto_oshibsja(imja)
 
CLAUSES
        odin_iz(Chto,[Chto|_]).
        odin_iz(Chto,[_|Hvost]):-odin_iz(Chto,Hvost).
 
        skazal(plovec(a,Mesto)) :- Mesto = pervyj.  
        skazal(plovec(b,Mesto)) :- not(Mesto = chetvertyj).       
        skazal(plovec(v,Mesto)) :- not(Mesto = chetvertyj).  
        skazal(plovec(g,Mesto)) :- not(Mesto = pervyj),not(Mesto = chetvertyj).
        
        proverka_vyskazyvanij(plovec(Imya,Mesto),Imya) :- !,not(skazal(plovec(Imya,Mesto))).    
        proverka_vyskazyvanij(Plovec,_) :- skazal(Plovec).         
 
        kto_oshibsja(Oshibsja) :- 
                PlovecA = plovec(ImjaA,MestoA),
                odin_iz(ImjaA,[a,b,v,g]),
                odin_iz(MestoA,[pervyj,vtoroj,tretij,chetvertyj]),
                PlovecB = plovec(ImjaB,MestoB),
 
                odin_iz(ImjaB,[a,b,v,g]),
                odin_iz(MestoB,[pervyj,vtoroj,tretij,chetvertyj]),
                not(ImjaB = ImjaA),not(MestoB = MestoA),
                
                PlovecV = plovec(ImjaV,MestoV),
                odin_iz(ImjaV,[a,b,v,g]),
                odin_iz(MestoV,[pervyj,vtoroj,tretij,chetvertyj]),
                not(ImjaV = ImjaA),not(ImjaV = ImjaB),
                not(MestoV = MestoA),not(MestoV = MestoB),      
        
                PlovecG = plovec(ImjaG,MestoG),
                odin_iz(ImjaG,[a,b,v,g]),
                odin_iz(MestoG,[pervyj,vtoroj,tretij,chetvertyj]),
                not(ImjaG = ImjaA),not(ImjaG = ImjaB),not(ImjaG = ImjaV),
                not(MestoG = MestoA),not(MestoG = MestoB),not(MestoG = MestoV),
                
                odin_iz(Oshibsja,[a,b,v,g]),
                proverka_vyskazyvanij(PlovecA,Oshibsja),
                proverka_vyskazyvanij(PlovecB,Oshibsja),
                proverka_vyskazyvanij(PlovecV,Oshibsja),
                proverka_vyskazyvanij(PlovecG,Oshibsja).
 
GOAL
        kto_oshibsja(Oshibsja),!.
0
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 4
09.05.2011, 01:07  [ТС]
к сожалению, при решении программы нельзя пользоваться знаком !
0
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
09.05.2011, 01:30
Prolog
1
2
proverka_vyskazyvanij(plovec(Imya,Mesto),Imya) :- not(skazal(plovec(Imya,Mesto))).    
proverka_vyskazyvanij(plovec(Imya,Mesto),ImyaOshib) :- not(Imya=ImyaOshib),skazal(plovec(Imya,Mesto)).
А в goal можете просто стереть.
0
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 4
09.05.2011, 01:33  [ТС]
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
DOMAINS
        пловец = пловец(имя,место)
        имя,место=symbol        
        список_мест = место*
        список_имен = имя*
        список_пловцов = пловец*
        
PREDICATES
        nondeterm один_из(место,список_мест)
        nondeterm один_из(имя,список_имен)
        nondeterm сказал(пловец)
        nondeterm проверка_высказываний(пловец,имя)
        nondeterm кто_ошибся(имя)
 
CLAUSES
        один_из(Chto,[Chto|_]).
        один_из(Chto,[_|Hvost]):-один_из(Chto,Hvost).
 
        сказал(пловец(а,Mesto)) :- Mesto = первый.  
        сказал(пловец(г,Mesto)) :- Mesto = четвертый.       
        сказал(пловец(б,Mesto)) :- not(Mesto = четвертый).  
        сказал(пловец(в,Mesto)) :- not(Mesto = первый),not(Mesto = четвертый).
        
    проверка_высказываний(пловец(Imya,Mesto),Imya) :- not(сказал(пловец(Imya,Mesto))).    
    проверка_высказываний(пловец(Imya,Mesto),ImyaOshib) :- not(Imya=ImyaOshib),сказал(пловец(Imya,Mesto)). 
        
 
            кто_ошибся(Ошибся) :- 
        ПловецА = пловец(ИмяА,МестоА),
        один_из(ИмяА,[а,б,в,г]),
        один_из(МестоА,[первый,второй,третий,четвертый]),
        ПловецБ = пловец(ИмяБ,МестоБ),
        один_из(ИмяБ,[а,б,в,г]),
        один_из(МестоБ,[первый,второй,третий,четвертый]),
        not(ИмяБ = ИмяА),not(МестоБ = МестоА),      
        ПловецВ = пловец(ИмяВ,МестоВ),
        один_из(ИмяВ,[а,б,в,г]),
        один_из(МестоВ,[первый,второй,третий,четвертый]),
        not(ИмяВ = ИмяА),not(ИмяВ = ИмяБ),
        not(МестоВ = МестоА),not(МестоВ = МестоБ),      
        ПловецГ = пловец(ИмяГ,МестоГ),
        один_из(ИмяГ,[а,б,в,г]),
        один_из(МестоГ,[первый,второй,третий,четвертый]),
        not(ИмяГ = ИмяА),not(ИмяГ = ИмяБ),not(ИмяГ = ИмяВ),
        not(МестоГ = МестоА),not(МестоГ = МестоБ),not(МестоГ = МестоВ),
                        
                один_из(Ошибся,[а,б,в,г]),
                проверка_высказываний(ПловецА,Ошибся),
                проверка_высказываний(ПловецБ,Ошибся),
                проверка_высказываний(ПловецВ,Ошибся),
                проверка_высказываний(ПловецГ,Ошибся).
 
GOAL
        кто_ошибся(Ошибся).
выдает нет решения.
0
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
09.05.2011, 02:01
Возьмите все объекты типа string в кавычки ("a","первый"...), действительно без этого почему-то не работает.
1
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 4
09.05.2011, 10:24  [ТС]
Спасибо за совет))
но получилось 48 решений, что А ошибся)) а нужно чтоб было только одно решение... без прерываний, сама незнаю как это исправить...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2011, 10:24
Помогаю со студенческими работами здесь

Определить место самого юного участника соревнования
Поля структуры: фамилия, имя, возраст, структура результат: мин. сек.; Подскажите, как определить место самого юного участника соревнования...

Перенос программы с Visual Prolog 7.1 в Visual Prolog 7.5
Проблема переноса. Взяла пример с книги Visual Prolog 7.1 для начинающих. Это игра червь. Вроде всё, что не компилировалось я исправила, но...

Может кто хочет поучаствовать со своим автомобилем: соревнования
Вот такое объявление нашел - может кому надо на следующие выходные:

Задача. соревнования. [перевести на Turbo с Visual]
Задача нужна на турбо прологе,точнее ее решение, 1) Кто участвовал в соревнованиях ? Если Иванов не участвовал или Петров ...

Пожалуйста, помоите переделать программу с Turbo Prolog на Visual Prolog
DOMAINS l_i=integer* l_s=string* i=integer s=string c=char structura=str(i,s) %Структура Порода-Параметры и его список ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru