Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Задача Миры Смаллиана Лев и Единорог
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Agyx Agyx вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2013
Question Задача Миры Смаллиана Лев и Единорог - 18.11.2013, 20:52

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

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

haskell Код:
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]
Некоторые наработки, как дальше не знаю.
Ответить с цитированием
  (#3 (permalink)) Старый
beroal beroal вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 4 сообщениях
Регистрация: 13.12.2002
По умолчанию 19.11.2013, 03:35

Пусть функция e::Week -> Bool задаёт истинность некоторого высказывания в зависимости от дня недели.
haskell Код:
say :: Person -> (Week -> Bool) -> Week -> Bool
say p e d = lies p d /= e d
Если это высказывание сказал персонаж p, тогда say p e d должно быть истинным в день недели d.

«Лев сказал, что Лев лгал вчера» кодируется программой
haskell Код:
\d -> say Lion (lies Lion . yesterday) d
.

Ответ первой задачи — четверг.
Ответить с цитированием
Пользователь сказал cпасибо:
Agyx (19.11.2013)
  (#4 (permalink)) Старый
beroal beroal вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 4 сообщениях
Регистрация: 13.12.2002
По умолчанию 19.11.2013, 03:45

Мелочи:
  • Заменить Week на WeekDay.
  • Я бы работал с днями недели с помощью преобразования между WeekDay и Int и функции (`mod` 7).
  • [minBound..]::[WeekDay]
Ответить с цитированием
  (#5 (permalink)) Старый
Agyx Agyx вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2013
По умолчанию 19.11.2013, 09:35

Спасибо, буду пробывать!
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Agyx Agyx вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2013
По умолчанию 19.11.2013, 11:41

Простите, но в первой задаче нужно чтобы выводился какой день был вчера, а у вас выводится сегодня. И будьте добры, напишите подробней, как запустить ваш вариант, пожалуйста. Я нуль в хаскелле, только начинаю, пока голова пухнет и совсем не понимаю как запустить данную интерпретацию. Заранее спасибо.
Ответить с цитированием
  (#7 (permalink)) Старый
beroal beroal вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 4 сообщениях
Регистрация: 13.12.2002
По умолчанию 19.11.2013, 14:26

Тут не надо быть специалистом по Haskell. Предикат для первой задачи:
haskell Код:
\d -> say Lion (lies Lion . yesterday) d && say Unicorn (lies Unicorn . yesterday) d
Вам нужно найти дни недели, когда этот предикат истинный. Потом найти вчерашние дни.
haskell Код:
(map yesterday . filter
  (\d -> say Lion (lies Lion . yesterday) d && say Unicorn (lies Unicorn . yesterday) d))
  [minBound..]
Ответить с цитированием
  (#8 (permalink)) Старый
Agyx Agyx вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.11.2013
По умолчанию 19.11.2013, 14:44

Но не работает почему тогда, ругается на точку.
Ответить с цитированием
  (#9 (permalink)) Старый
beroal beroal вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 3
Поблагодарили 4 раз(а) в 4 сообщениях
Регистрация: 13.12.2002
По умолчанию 19.11.2013, 16:10

Отформатируйте код в одну строку.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача ExTReM13 Задания за деньги 2 07.10.2012 18:06
Помогите, задача по прологу, срочно...задача с высказываниями 4ixOn Prolog 6 10.07.2011 23:29
Помогите, задача по прологу, срочно...задача о станках 4ixOn Prolog 3 09.07.2011 22:48
Задача по MPI 45$ Naikon1988 Задания за деньги 2 22.12.2010 18:12
Миры Р. Смаллиана: Траляля и Труляля как решить задачу iKalentii Haskell 11 04.12.2010 02:28
Миры Р. Смаллиана: Траляля и Труляля[Haskell] iKalentii Задания за деньги 1 03.12.2010 19:15
Миры Р. Смаллиана: Траляля и Труляля mickey Prolog 4 02.12.2010 00:18
задача ars87 Prolog 1 24.05.2010 20:28
HELP! Задача alex3820 Prolog 6 19.07.2008 02:37
Задачи Р. Смаллиана mickey Prolog 7 11.11.2007 15:56
задача про БД.... imported_ben Prolog 2 18.07.2007 15:37
Задача D-Za Visual Basic 0 19.04.2007 13:51



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов