Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088

Пример типа с предикатом на Idris

30.06.2022, 23:38. Показов 976. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как создать тип с предикатом на Idris 2? а то непонятно где про это почитать.

Моя версия не работает:
Haskell
1
2
data Pred1 : Type -> Type where
  CPred1 : (Ord a, Num a) => (x : a) -> Pred1 (x ** x < 3 = True)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.06.2022, 23:38
Ответы с готовыми решениями:

Нужен пример указателя на массив с приведением типа
Нужен пример указателя на массив с приведением типа, чтобы сделать вот так : char test = 'Ş'; byte* test_ptr = null; ...

Пример использования массива с индексами нечислового типа
Есть ли какой-либо пример использования массива с индексами нечислового типа? Не могу понять, зачем такие массивы нужны и как их...

Условие выбора с предикатом between
Добрый вечер, Уважаемые форумчане! С недавнего времени пришла необходимость работать с таблицами представления и я обратил внимание на...

5
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
01.07.2022, 12:47
Что-то я не понял, что ты хочешь сделать.

Допустим, хочешь определить предикат $P$ так, чтобы $P(x) = (x < 3)$ (или же $x^x < 3$?)
Тогда это будет просто функция
Haskell
1
2
3
4
5
6
7
P : (Ord a, Num a) => (x : a) -> Type
P x = x < 3 = True
-- для Nat лучше: P x = LT x 3
 
-- пример
proof_P2 : P 2
proof_P2 = Refl
Если же нужно описать тип предиката, то будет
Haskell
1
2
3
4
5
6
data PredP : (a : Type) -> Type where
  MkPredP : {0 a : Type} -> ((x : a) -> Type) -> PredP a
 
-- пример
PredP_P : (Ord a, Num a) => PredP a
PredP_P = MkPredP P
2
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
01.07.2022, 14:23  [ТС]
Например, хочу определить тип в котором x < 3. Чтобы в конструктор нельзя было завернуть другое значение.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
01.07.2022, 15:06
Тогда первое.
Например,
Haskell
1
2
3
4
5
6
7
8
9
P : (Ord a, Num a) => (x : a) -> Type
P x = x < 3 = True
 
0 plemma : {n : Nat} -> (compareNat n 2) == LT = True -> (compareNat n 3) == LT = True
 
-- аргумент n обязан удовлетворять (n < 3)
repeatAFewTimes : (n : Nat) -> {auto 0 p : P n} -> {a : Type} -> ((x : a) -> a) -> ((x : a) -> a)
repeatAFewTimes Z f = id
repeatAFewTimes (S n) {p} f = \x => f (repeatAFewTimes n {p = plemma p} f x)
Впрочем, именно для этой задачи лучше использовать тип Data.Nat.LTE или на крайний случай Data.So. Потому что в противном случае надо будет постоянно самому доказывать леммы вроде той, что в примере.
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
19.07.2022, 11:21  [ТС]
Видимо, это называется "уточняющим типом":
https://en.wikipedia.org/wiki/Refinement_type
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
24.07.2022, 12:47
Да. Правда, в Idris, по-видимому, нет богатой встроенной поддержки уточняющих типов, хотя есть в стандартной библиотеке Data.DPair.Subset
Haskell
1
2
3
4
  record Subset type pred where
    constructor Element
    fst : type
    0 snd : pred fst
цитата из Data.DPair

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
namespace Subset
 
  ||| A dependent pair in which the second field (evidence) should not
  ||| be required at runtime.
  |||
  ||| We can use `Subset` to provide extrinsic invariants about a
  ||| value and know that these invariants are erased at
  ||| runtime but used at compile time.
  |||
  ||| @type The type-level value's type.
  ||| @pred The dependent type that requires an instance of `type`.
  public export
    record Subset type pred where
      constructor Element
      fst : type
      0 snd : pred fst
 
  public export
  curry : {0 p : a -> Type} -> (Subset a p -> c) -> (x : a) -> (0 _ : p x) -> c
  curry f x y = f $ Element x y
 
  public export
  uncurry : {0 p : a -> Type} -> ((x : a) -> (0 _ : p x) -> c) -> Subset a p -> c
  uncurry f s = f s.fst s.snd
 
  export
  elementInjectiveFst : Element x p = Element y q -> x = y
  elementInjectiveFst Refl = Refl
 
  export
  elementInjectiveSnd : Element x p = Element x q -> p = q
  elementInjectiveSnd Refl = Refl
 
  public export
  bimap : (f : a -> b) -> (0 _ : forall x. p x -> q (f x)) -> Subset a p -> Subset b q
  bimap f g (Element x y) = Element (f x) (g y)
 
  public export
  Eq type => Eq (Subset type pred) where
    (==) = (==) `on` fst
 
  public export
  Ord type => Ord (Subset type pred) where
    compare = compare `on` fst
 
  ||| This Show implementation replaces the (erased) invariant
  ||| with an underscore.
  export
  Show type => Show (Subset type pred) where
    showPrec p (Element v _) = showCon p "Element" $ showArg v ++ " _"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.07.2022, 12:47
Помогаю со студенческими работами здесь

Нужен пример xml файла типа заказ в кафе
Заранее спасибо!!

Вывод произвольного типа записей с пагинацией. Рабочий пример
Возникла проблема. У меня есть произвольный тип записей. Я даже научился выводить записи с этим типом. Но не работает пагинация, при...

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

Пролог работа с предикатом findall
Помогите пжлта, программа написана в прологе. С помощью предиката findall получите список всех мужчин призывного возраста (от 18 до 27 лет)...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru