Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
FeL_6
0 / 0 / 0
Регистрация: 22.04.2019
Сообщений: 9
1

Разработайте тип данных Prop

06.05.2019, 15:48. Просмотров 1916. Ответов 2

В общем существует такая задача:
Утверждением будем называть логическую формулу, имеющую одну из следующих форм:
• имя переменной (строка)
• p & q
• p | q
• ~p
где p и q — утверждения. Например, утверждениями являются следующие формулы:
• x
• x | y
• x & (x | ~y)
Разработайте тип данных Prop, представляющий утверждения такого вида. Определите следующие функции:
1) vars :: Prop -> [String], которая возвращает список имен переменных (без повторений), встречающихся в утверждениях.
2) Пусть задан список имен переменных и их значений типа Bool, например [("x",True),("y",False)].
Определите функцию truthValue :: Prop -> [(String,Bool)] -> Bool, которая определяет, верно ли утверждение, если переменные имеют заданные списком значения.
3) Определите функцию tautology :: Prop -> Bool, которая возвращает True, если утверждение верно при любых значениях переменных, встречающихся в нем (например, это выполняется для утверждения (x | ~x)).


Решение было найдено, но, как понятно, оно написано не мной. Можете объяснить что тут к чему(желательно построчно), и какие запросы можно писать?

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
import Data.List (nub)
 
data Prop = And Prop Prop | Or Prop Prop | Not Prop | Var String deriving Show 
 
vars :: Prop -> [String]
vars = nub . go where 
    go (And a b) = concat [go a, go b] 
    go (Or a b)  = concat [go a, go b]
    go (Not a)   = go a
    go (Var s)   = [s]
 
unsafeLookup :: Eq a => a -> [(a, b)] -> b
unsafeLookup x t = case lookup x t of Just x -> x
 
truthValue :: [(String, Bool)] -> Prop -> Bool
truthValue table = go where
    go (And a b) = go a && go b
    go (Or a b)  = go a || go b
    go (Not a)   = not (go a)
    go (Var a)   = unsafeLookup a table
 
gen :: [a] -> [b] -> [[(a, b)]]
gen []     _  = [[]]
gen (x:xs) ys = concat[(p:) `map` gen xs ys | p <- [(x, y) | y <- ys]]
 
tautology :: Prop -> Bool
tautology prop = all (flip truthValue prop) $ gen (vars prop) [True, False]
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2019, 15:48
Ответы с готовыми решениями:

Разработайте тип данных Prop
Утверждением будем называть логическую формулу, имеющую од- ну из следующих форм: • имя...

Разработайте тип данных Prop, представляющий утверждения такого вида
Помогите пожалуйста с заданиям,очень надо. Разработайте тип данных Prop, представляющий...

Разработать тип данных Prop, представляющий утверждения заданного вида
Помогите пожалуйста. Утверждением будем называть логическую формулу, имеющую одну из следующих...

Разработайте тип данных Product
Реализуйте с помощью функций высшего порядка: В современных web-магазинах часто продают книги,...

Разработайте тип данных, характеризующий операции над строками
Определим следующий набор операций над строками: Очистка: удаление всех символов из строки...

2
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
07.05.2019, 09:15 2
Лучший ответ Сообщение было отмечено FeL_6 как решение

Решение

Цитата Сообщение от FeL_6 Посмотреть сообщение
Решение было найдено, но, как понятно, оно написано не мной. Можете объяснить что тут к чему(желательно построчно), и какие запросы можно писать?
Напишите сами, готовые чужие решения полезны только когда у вас есть своё готовое решение. Если конечно вы не читер на сайтах, где нужно решать задачки по программированию.
Если вы не можете вызвать функцию, то скорее всего не понимаете, как пользоваться конструкторами данных.
Кроме того, Prop - рекурсивный тип данных. Именно с рекурсией могут возникать проблемы с пониманием кода.
Тут не нужно пытаться проглотить задачу целиком, задание из пункта 1 предполагает, что вы знаете как писать рекурсивные функции, поэтому для начала стоит потренироваться писать простые рекурсивные функции - например, функцию, которая добавляет 1 к каждому элементу списка.

Запускаем интерпретатор Haskell
Bash
1
$ ghci
Загружаем файл и начинаем экспериментировать(параллельно читая учебники и проходя онлайн курсы):
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
> :l source_name.hs
> x1 = "Луна - спутник Земли"
> x2 = "Снег белый"
> x3 = "Все люди - чайники"
-- Утверждение: "Луна - спутник Земли и cнег - белый"
> t1 = And (Var x1) (Var x2)
-- Утверждение: (Все люди - чайники и неверно, что Луна - спутник Земли) или (Луна - спутник Земли и cнег - белый)"
> t2 = Or (And (Not (Var x1)) (Var x3)) t1
-- Тавтология : Снег - белый или неверно, что снег - белый
> t3 = Or (Var x1) (Not (Var x1))
> :m + Control.Monad -- из этого модуля понадобилась функция mapM_  для вывода текста в интерпретаторе на кириллице
> mapM_ putStrLn $ vars t1 -- без "mapM_ putStrLn" русские слова будут не читабельны
Луна - спутник Земли
Снег белый
> mapM_ putStrLn $ vars t2
Луна - спутник Земли
Все люди - чайники
Снег белый
> l = [(x1, True), (x2, True), (x3, False)]
> truthValue l t1
True
> truthValue l t2
True
-- В тавтологиях истинность отдельных высказываний не имеет значения - важна структура всего утверждения.
> tautology t1
False
> tautology t2
False
> tautology t3
True
Но я бы вместо конструктора Var String, Сделал бы конструктор Var String Bool (немного противоречит заданию).

Вот ссылки вам в помощь:
Полезные ссылки по Haskell
Полезные ссылки по Haskell
ruhaskell → links
2
FeL_6
0 / 0 / 0
Регистрация: 22.04.2019
Сообщений: 9
13.05.2019, 19:20  [ТС] 3
XRuZzz, премного благодарен за помощь!
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2019, 19:20

Утверждения Prop
Утверждением будем называть логическую формулу, имеющую одну из следующих форм: имя переменной...

Разработайте и реализуйте абстрактный тип данных
Помогите пожалуйста с задачей. Разработайте и реализуйте абстрактный тип данных для...

Разработайте и реализуйте абстрактный тип данных для представления треугольника
Разработайте и реализуйте абстрактный тип данных для представления треугольника. Данные этого типа...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.