С Новым годом! Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 18.11.2013
Сообщений: 6

Задача Миры Смаллиана Лев и Единорог

18.11.2013, 19:55. Показов 2727. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать программу! Совсем ничего не получается!

Когда Алиса вошла в Лес Забывчивости, она забыла не все, а лишь кое-что. Она часто забывала, как ее зовут, но особенно ей легко удавалось забывать дни недели. Лев и Единорог частенько наведывались в Лес Забывчивости. Странные это были существа. Лев лгал по понедельникам, вторникам и средам и говорил правду во все остальные дни недели. Единорог же вел себя иначе: он лгал по четвергам, пятницам и субботам и говорил правду во все остальные дни недели.
Задача 1
Однажды Алиса повстречала Льва и Единорога, отдыхавших под деревом. Те высказали следующие утверждения.
Лев. Вчера был один из дней, когда я лгу.
Единорог. Вчера был один из дней, когда я тоже лгу.
Из этих двух высказываний Алиса (девочка очень умная) сумела вывести, какой день недели был вчера. Что это был за день?
Задача 2
В другой раз Алиса повстречала одного Льва. Он высказал два утверждения:
1) Я лгал вчера.
2) После завтрашнего дня я буду лгать два дня подряд.
В какой день недели Алиса встретила Льва?
Задача 3
В какие дни недели Лев может высказать следующие утверждения:
1) Я лгал вчера.
2) Я буду лгать завтра.
Задача 4
В какие дни недели Лев может высказать следующее единое утверждение: «Я лгал вчера, и я буду лгать завтра». Предостережение! Ответ этой задачи не совпадает с ответом предыдущей задачи.
Жду вашей помощи!!! спасибо!!!

Добавлено через 33 минуты
Haskell
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
import List (nub)
-- lion lies Unicorn part
 
data Person = Lion | Unicorn
data Week = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Show,Enum)
data Expr = Person (Week -> Week) Bool
 
type Affirmation = (Expr)
 
lies :: Person -> Week -> Bool
lies Lion Monday = True
lies Lion Tuesday = True
lies Lion Wednesday = True
lies Lion _ = False
lies Unicorn Thursday = True
lies Unicorn Friday = True
lies Unicorn Saturday = True
lies Unicorn _ = False
 
yesterday :: Week -> Week
yesterday Monday = Sunday
yesterday day = pred day
 
tomorrow :: Week -> Week
tomorrow Sunday = Monday
tomorrow day = succ day
 
--Lies yesterday
liesYesterday :: Person -> [Bool]
liesYesterday p = map (\x-> lies p (yesterday x)) [Monday .. Sunday]
 
--lies tomorrow
liesTomorrow :: Person -> [Bool]
liesTomorrow p = map (\x-> lies p (tomorrow x)) [Monday .. Sunday]
 
--Truth or Lie say Person in day
val :: Expr -> Week -> Bool
val (p,f,b) d = 
    let rd = lies p d 
        rf = lies p (f d)
        in if (rf == b)&&rd
           then True
           else False
           
--What is today
today :: Expr -> [Week]
today (p,f,b) = filter (\x -> val(p,f,b) x) [Monday .. Sunday]
Некоторые наработки, как дальше не знаю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2013, 19:55
Ответы с готовыми решениями:

Параллельные миры
У меня о параллельных мирах определенного мнения нет. Хотелось бы услышать мнения других. В теме про НЛО меня порадовали. Давно я так не...

Лев () и Прав ()
Подскажите как написать правильно условие. В ячейки написан текст "Г МОСКВА" мне нужно вывести только "МОСКВА", я пишу ...

Как сказать, что единорог лжет два дня подряд?
Задание: Известно, что Единорог лжет по понедельникам, вторникам и средам и говорит правду во все остальные дни недели. Он может сказать:...

10
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
18.11.2013, 21:44
Вот мое решение первой задачи:

Haskell
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
data Person = Lion | Unicorn deriving (Eq,Show)
data Week = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Show,Enum)
 
lies :: Person -> Week -> Bool
lies Lion Monday = True
lies Lion Tuesday = True
lies Lion Wednesday = True
lies Lion _ = False
lies Unicorn Thursday = True
lies Unicorn Friday = True
lies Unicorn Saturday = True
lies Unicorn _ = False
 
yesterday :: Week -> Week
yesterday Monday = Sunday
yesterday day = pred day
 
tomorrow :: Week -> Week
tomorrow Sunday = Monday
tomorrow day = succ day
 
-- sayY - что должен сказать персонаж о своем вчерашнем дне
 
sayY :: Week -> Person -> Bool
sayY x p = if (lies p x) then not w else w
           where w = (lies p (yesterday x))
 
-- решение: перебираем все дни недели и просто ищем,
-- когда оба персонажа говорят "вчера не врал"
 
task1 = fst $ head w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion) && (sayY x Unicorn))) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
 
-- Пробуем
 
Prelude> task1
 
Thursday
1
0 / 0 / 0
Регистрация: 18.11.2013
Сообщений: 6
19.11.2013, 09:11  [ТС]
Спасибо, попробую воспользоваться вашим путём. Всех благ Вам!!!

Добавлено через 1 час 6 минут
Я попробывала сделать по аналогии:
Haskell
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
 
data Person = Lion | Unicorn deriving (Eq,Show)
data Week = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Show,Enum)
 
lies :: Person -> Week -> Bool
lies Lion Monday = True
lies Lion Tuesday = True
lies Lion Wednesday = True
lies Lion _ = False
lies Unicorn Thursday = True
lies Unicorn Friday = True
lies Unicorn Saturday = True
lies Unicorn _ = False
 
yesterday :: Week -> Week
yesterday Monday = Sunday
yesterday day = pred day
 
tomorrow :: Week -> Week
tomorrow Sunday = Monday
tomorrow day = succ day
 
-- sayY - что должен сказать персонаж о своем вчерашнем дне
 
sayY :: Week -> Person -> Bool
sayY x p = if (lies p x) then not w else w
           where w = (lies p (yesterday x))
           
sayT :: Week -> Person -> Bool
sayT x p = if (lies p x) then not w else w
            where w = (lies p (tomorrow x))
           
sayAT :: Week -> Person -> Bool
sayAT x p = if (lies p x) then not w else w
            where w = (lies p (tomorrow(tomorrow x)))
 
-- решение: перебираем все дни недели и просто ищем,
-- когда оба персонажа говорят "вчера не врал"
 
task1 = fst $ head w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion) && (sayY x Unicorn))) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
        
task2 = fst $ head w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion) && (sayAT x Lion))) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
        
task3 = w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion) || (sayT x Lion))) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
 
task4 = fst $ head w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion) && (sayT x Lion))) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
Результаты получаются:
Haskell
1
2
3
4
5
6
7
8
*Main> task1
Thursday
*Main> task2
*** Exception: Prelude.head: empty list
*Main> task3
[(Monday,True),(Wednesday,True),(Thursday,True),(Sunday,True)]
*Main> task4
*** Exception: Prelude.head: empty list
Что неправильно я сделала в task2 и task4. И подскажите пожалуйста как сделать, чтобы во второй задачке выводились только дни, при чем как два разных варианта исхода? Заранее спасибо.

Добавлено через 10 часов 10 минут
Проглядели мы с вами в первой то задаче должен получиться не сегодняшний день, а вчерашний, правильный ответ среда.
Вот ответы:
1) Вчера - Среда
2) Сегодня - Понедельник
3) Сегодня - Понедельник, Среда, Четверг, Воскресенье.
4) Не может такого быть.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
19.11.2013, 10:49
Цитата Сообщение от Agyx Посмотреть сообщение
Проглядели мы с вами в первой то задаче должен получиться не сегодняшний день, а вчерашний, правильный ответ среда.
- можно и так трактовать. Не люблю болтологические задачи с неоднозначной трактовкой.
1
0 / 0 / 0
Регистрация: 18.11.2013
Сообщений: 6
19.11.2013, 10:52  [ТС]
Подскажите пожалуйста в чем я ошиблась в task2 и task4. И как сделать, чтобы в третьей задачке выводились только дни, при чем как два разных варианта исхода? Заранее спасибо. Я практический нуль в Haskell и очень сложно дается понимание структуры.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
19.11.2013, 11:09
Цитата Сообщение от Agyx Посмотреть сообщение
Подскажите пожалуйста в чем я ошиблась в task2
- Лев сказал: "после завтрашнего дня я буду лгать два дня подряд" - поэтому нужно формировать три условия вчера, послезавтра и через два дня
1
0 / 0 / 0
Регистрация: 18.11.2013
Сообщений: 6
19.11.2013, 11:19  [ТС]
Haskell
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
 
data Person = Lion | Unicorn deriving (Eq,Show)
data Week = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Show,Enum)
 
lies :: Person -> Week -> Bool
lies Lion Monday = True
lies Lion Tuesday = True
lies Lion Wednesday = True
lies Lion _ = False
lies Unicorn Thursday = True
lies Unicorn Friday = True
lies Unicorn Saturday = True
lies Unicorn _ = False
 
yesterday :: Week -> Week
yesterday Monday = Sunday
yesterday day = pred day
 
tomorrow :: Week -> Week
tomorrow Sunday = Monday
tomorrow day = succ day
 
aftertomorrow :: Week -> Week
aftertomorrow Saturday = Monday
aftertomorrow Sunday = Tuesday 
aftertomorrow day = succ (succ day)
 
aatomorrow :: Week -> Week
aatomorrow Saturday = Monday
aatomorrow Sunday = Tuesday 
aatomorrow day = succ (succ (succ day))
 
-- sayY - что должен сказать персонаж о своем вчерашнем дне
 
sayY :: Week -> Person -> Bool
sayY x p = if (lies p x) then not w else w
           where w = (lies p (yesterday x))
           
sayT :: Week -> Person -> Bool
sayT x p = if (lies p x) then not w else w
            where w = (lies p (tomorrow x))
           
sayAT :: Week -> Person -> Bool
sayAT x p = if (lies p x) then not w else w
            where w = (lies p (aftertomorrow x))
            
sayAAT :: Week -> Person -> Bool
sayAAT x p = if (lies p x) then not w else w
            where w = (lies p (aatomorrow x))
 
-- решение: перебираем все дни недели и просто ищем,
-- когда оба персонажа говорят "вчера не врал"
 
task2 = w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion)) && (sayAT x Lion) && (sayAAT x Lion)) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
        
task3 = w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion) || (sayT x Lion))) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
Вот сделала три условия, но теперь выдает ошибку:
Haskell
1
2
3
4
5
ERROR file:.\task1.hs:60 - Type error in application
*** Expression     : (x,sayY x Lion) && sayAT x Lion && sayAAT x Lion
*** Term           : (x,sayY x Lion)
*** Type           : (Week,Bool)
*** Does not match : Bool
Как правильно описать условие?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
19.11.2013, 11:23
Haskell
1
(\ x -> (x , ((sayY x Lion) && (sayAT x Lion) && (sayAAT x Lion))))
1
0 / 0 / 0
Регистрация: 18.11.2013
Сообщений: 6
19.11.2013, 11:32  [ТС]
Haskell
1
2
task2 = fst $ head w 
        where w = filter snd $ map (\ x -> (x , (sayY x Lion) && (sayAAT x Lion))) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
А вот так работает и выдает правильный ответ Monday, правильно ли будет оставить таким условие?

Haskell
1
2
task2 =  w 
        where w = filter snd $ map (\ x -> (x , ((sayY x Lion) && (sayAT x Lion) && (sayAAT x Lion))))[Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
Так выдает пустой список, не находит правильный ответ

Добавлено через 8 минут
Спасибо Вам за помощь, премного благодарна. Последний вопрос: подскажите как выводить из полученного списка в task3 [[(Monday,True),(Wednesday,True),(Thursday ,True),(Sunday,True)] только сами дни. Если писать fst $ head w то только самый первый выводится один.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38164 / 21099 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
19.11.2013, 11:38
Цитата Сообщение от Agyx Посмотреть сообщение
А вот так работает и выдает правильный ответ Monday, правильно ли будет оставить таким условие?
- выдает-то понедельник... Но противоречит условиям задачи (два дня подряд, а у Вас проверка только "послепослезавтра"). Может, в условии ошибка?

Как выводить только дни?

Haskell
1
 map fst список
1
0 / 0 / 0
Регистрация: 18.11.2013
Сообщений: 6
19.11.2013, 11:45  [ТС]
Вроде все условия аналогичны. Буду разбираться. Спасибо Вам огромное!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2013, 11:45
Помогаю со студенческими работами здесь

А есть ли игры, чьи миры скручены в ленту мёбиуса?
А есть ли игры, чьи миры скручены в ленту мёбиуса?

Лев Алекс и микроволновка
Помогите пожалуйста написать программу для задачи (срочно, чтоб было понятно, что делал первокурсник) ) Алекс и стейк Ограничение...

Ткаченко Лев Артурович
Лев Артурович Ткаченко очень необычный поэт, он пишет иногда стихи на языке C++: Love.cpp #include <God.h> #include...

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

Игра "Лев и гиена"
Task 1 : Создайте программу, которая будет играть в игру "Лев и гиена" с пользователем. Игра работает следующим образом: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru