Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Миры Р. Смаллиана: Траляля и Труляля[Haskell]
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
LolAgx LolAgx вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.11.2013
По умолчанию Миры Р. Смаллиана: Траляля и Труляля[Haskell] - 26.11.2013, 11:19

Помогите пожалуйста написать прогу! Я в Haskell'e ноль и ни чего понять не могу
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
В книге Р. Смаллиана «Как же называется эта книга?» приводится много логических задач, в которых персонажи высказывают некоторые автореферентные утверждения, прямо или косвенно говорящие об истинности этих утверждений. Персонажи этих задач населяют некоторый остров и относятся к одной из двух категорий: «рыцари», которые го-ворят только правду, и «лжецы», изрекающие только ложь. Предполагается, что каждый обитатель острова либо рыцарь, либо лжец. В статье [1] предлагаются метод решения не-которых задач с автореферентными рассуждениями с помощью программирования на языке Пролог.
Рассмотрим задачи Р. Смаллиана с автореферентными утверждениями другого типа.
Когда Алиса вошла в Лес Забывчивости, она забыла не все, а лишь кое-что. Она часто забывала, как ее зовут, но особенно ей легко удавалось забывать дни недели. Траля-ля и Труляля частенько наведывались в Лес Забывчивости. Странные это были существа. Один из них лгал по понедельникам, вторникам и средам и говорил правду во все остальные дни недели. Другой лгал по четвергам, пятницам и субботам, но во все остальные дни недели говорил правду. Но Алиса не знала, кто из них ведет себя так или иначе. К тому же братья были так похожи друг на друга, что Алиса даже не могла различить их (воротнички, на которых были вышиты их имена, братья одевали очень редко). Бедняжке Алисе приходилось очень туго! Взять хотя бы следующие случаи.

Задача 1
Однажды Алиса встретила обоих братьев вместе, и они высказали следующие утверждения:
Первый. Я Траляля.
Второй. Я Труляля.
Кто из них в действительности был Траляля и кто – Труляля?

Задача 2
В другой день той же недели братцы высказали следующие утверждения:
Первый. Я Траляля.
Второй. Если это так, то я Труляля!
Кто из них Траляля и кто Труляля?

Задача 3
Как-то Алиса встретила обоих братцев и спросила у одного из них: «Вы лжете по воскресеньям?» Тот ответил: «Да!» Тогда она задала тот же вопрос другому братцу. Что он ответил?

Задача 4
В другой раз братья заявили следующее:
Первый. 1) Я лгу по субботам.
2) Я лгу по воскресеньям.
Второй. Я буду лгать завтра.
В какой из дней недели это было?

Задача 5
Однажды Алиса встретила одного из братцев. Он заявил следующее: «Я лгу сего-дня или я Труляля». Можно было бы в этом случае определить, кто из братьев это был?

Задача 6
Предположим, что встреченный Алисой братец заявил: «Я лгу сегодня или я Труляля». Можно было бы в этом случае определить, кто из братьев это был?

Задача 7
Однажды Алиса встретила обоих братцев вместе. Они высказали следующие утверждения.
Первый. Если я Траляля, то он Труляля.
Второй. Если он Труляля, то я Траляля.
Можно ли определить, кто из братцев Траляля и кто Труляля? Можно ли определить, что это был за день недели?

Напишите программу на языке Haskell, решающую подобные задачи, в частности, она должна уметь решать задачи 1–7.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
предполагаю как только объявить переменные
haskell Код:
data Person = Tralala | Trulala deriving (Eq,Show)
data WeekDay = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Show,Enum)
и как задать правило лжет и правило завтра
haskell Код:
-- правило лжет
lies :: Person -> WeekDay -> Bool
lies Tralala Monday = True
lies Tralala Tuesday = True
lies Tralala Wednesday = True
lies Tralala  _ = False
lies Trulala Thursday = True
lies Trulala Friday = True
lies Trulala Saturday = True
lies Trulala _ = False

-- правило завтра
tomorrow :: WeekDay -> WeekDay
tomorrow Sunday = Monday
tomorrow day = succ day
дальше ступор
Ответить с цитированием
  (#2 (permalink)) Старый
LolAgx LolAgx вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.11.2013
По умолчанию 27.11.2013, 23:27

Решила пока что только 3 задачи из 7ми, а сдавать уже завтра Щас берусь за 4ю. Если кто может помогите пожалуйста. Вот мой код:
haskell Код:
data Person = Tralala | Trulala deriving (Eq,Show)

data WeekDay = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Eq,Show,Enum)

truth :: WeekDay -> Person -> Bool
truth Monday Tralala = False
truth Tuesday Tralala = False
truth Wednesday Tralala = False
truth _ Tralala = True
truth Thursday Trulala = False
truth Friday Trulala = False
truth Saturday Trulala = False
truth _ Trulala = True

whoIsIt :: [WeekDay] -> Person -> Person
whoIsIt [Monday] Tralala = Trulala
whoIsIt [Tuesday] Tralala = Trulala
whoIsIt [Wednesday] Tralala = Trulala
whoIsIt [_] Tralala = Tralala
whoIsIt [Thursday] Trulala = Tralala
whoIsIt [Friday] Trulala = Tralala
whoIsIt [Saturday] Trulala = Tralala
whoIsIt [_] Trulala = Trulala

tomorrow :: WeekDay -> WeekDay
tomorrow Sunday = Monday
tomorrow day = succ day

-- Задача 1
-- Первый. Я Траляля
-- Второй. Я Труляля
-- Кто из них в действительности был Траляля и кто - Труляля
-- Решение: Находим когда оба говорят правду
arf1 = filter (\ x ->  (truth x Tralala) && (truth x Trulala)) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]
task_1 = putStrLn $ "First = "++ show(whoIsIt arf1 Tralala) ++ "\n" ++ "Second = "
         ++ show(whoIsIt arf1 Trulala) ++ "\n" ++ "Day = " ++ show ( head arf1 )
     
-- Задача 2
-- В другой день той же недели братцы высказали следующие утверждения
-- Первый. Я Траляля
-- Второй. Если это так, то я Труляля!
-- Кто из них Траляля и кто Труляля?

arf2 = filter (\ x -> (truth x Tralala)) [Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday]

task_2 = putStr $ "First = "++ show(whoIsIt [Monday] Tralala) ++ "\n" ++ "Second = "
          ++ show(if (whoIsIt [Monday] Tralala == Tralala )
            then Trulala
            else Tralala)
      ++ "\n" ++ "Day = " ++ show ( Monday ) ++ "\n" ++ "------------"++ "\n"
     
      ++"First = "++show(whoIsIt [Tuesday] Tralala) ++ "\n" ++ "Second = "
          ++ show(if (whoIsIt [Tuesday] Tralala == Tralala )
            then Trulala
            else Tralala)
      ++ "\n" ++ "Day = " ++ show ( Tuesday ) ++ "\n" ++ "------------"++ "\n"
     
      ++"First = "++show(whoIsIt [Wednesday] Tralala) ++ "\n" ++ "Second = "
          ++ show(if (whoIsIt [Wednesday] Tralala == Tralala )
            then Trulala
            else Tralala)
      ++ "\n" ++ "Day = " ++ show ( Wednesday) ++ "\n" ++ "------------"++ "\n"
     
      ++"First = "++show(whoIsIt [Thursday] Tralala) ++ "\n" ++ "Second = "
          ++ show(if (whoIsIt [Thursday] Tralala == Tralala )
            then Trulala
            else Tralala)
      ++ "\n" ++ "Day = " ++ show ( Thursday ) ++ "\n" ++ "------------"++ "\n"
     
      ++"First = "++show(whoIsIt [Friday] Tralala) ++ "\n" ++ "Second = "
          ++ show(if (whoIsIt [Friday] Tralala == Tralala )
            then Trulala
            else Tralala)
      ++ "\n" ++ "Day = " ++ show ( Friday ) ++ "\n" ++ "------------"++ "\n"
     
      ++"First = "++show(whoIsIt [Saturday] Tralala) ++ "\n" ++ "Second = "
          ++ show(if (whoIsIt [Saturday] Tralala == Tralala )
            then Trulala
            else Tralala)
      ++ "\n" ++ "Day = " ++ show ( Saturday ) ++ "\n" ++ "------------"
     

--Задача 3
--Как-то Алиса встретила обоих братцев и спросила у одного из них: "Вы лжете по воскресениям?"
--Тот ответил "Да!" Тогда она задала тот же вопрос другому брату. Что он ответил?
ask = not(truth Sunday Tralala) && not(truth Sunday Trulala)
answ = if (ask == True)
        then (truth Sunday Tralala) && (truth Sunday Trulala)
        else not(truth Sunday Tralala) && not(truth Sunday Trulala)
task_3 = putStrLn $ "Answer = " ++ show( if answ == True
                        then "Yes"
                        else "No")

--Задача 4
--В другой раз братья заявили следующее:
--Первый. 1) Я лгу по субботам.
--        2) Я лгу по восресеньям.
--Второй. Я буду лгать завтра.
--В какой день недели это было?


first = not(truth Saturday Tralala) && not (truth Sunday Tralala)
--second = not(truth (tomorrow f) Trulala)

task_4 = putStrLn $ "Day = "

--Задача 5
--Однажды Алиса встретила одного из братцев. Он заявил следующее:
--"Я лгу сегодня или я Труляля". Можно было бы в этом случае определить кто из братьев это был?

task_5 = putStrLn $ "This = "

--Задача 6
--Предположим, что встреченный Алисой братец заявил: "Я лгу сегодня или я Труляля"
--Можно было бы в этом случае определить, кто из братьев это был?

task_6 = putStrLn $ "This = "

--Задача 7
--Однажды Алиса встретила обоих братцев вместе. Они высказали следующие утверждения
--Первый. Если я Траляля, то он Труляля.
--Второй. Если он Труляля, то я Траляля.
--Можно ли определить, кто из братцев Траляля и кто Труляля? Можно ли определить, что это был за день недели?
task_7 = putStrLn $ "First = " ++ "\n" ++ "Second = " ++ "\n" ++ "Day = "

Последний раз редактировалось LolAgx; 27.11.2013 в 23:28 Причина: опечатка
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача Миры Смаллиана Лев и Единорог Agyx Haskell 8 19.11.2013 16:10
Ресурсы для программы Haskell Vladimir the Red Sunny Haskell 58 04.06.2012 09:52
Задачи на языке Haskell! gomon Haskell 2 21.01.2012 20:00
Использование комбинаторов в Haskell Undina Haskell 0 13.12.2011 12:53
Вложенный if then else в Haskell Елена_ Haskell 3 07.12.2011 10:52
Haskell после Пролога? pavelr Prolog 5 24.03.2011 22:29
Средства взаимодействия haskell Zambidis Haskell 4 15.12.2010 01:31
Миры Р. Смаллиана: Траляля и Труляля как решить задачу iKalentii Haskell 11 04.12.2010 02:28
Миры Р. Смаллиана: Траляля и Труляля[Haskell] iKalentii Задания за деньги 1 03.12.2010 19:15
Миры Р. Смаллиана: Траляля и Труляля mickey Prolog 4 02.12.2010 00:18
Как перевести программный код на Haskell winSistem32 Lisp 0 24.05.2008 18:59
Задачи Р. Смаллиана mickey Prolog 7 11.11.2007 15:56



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