Giter VIP home page Giter VIP logo

mscp-a's People

Contributors

mazdaywik avatar tonitan avatar

Stargazers

 avatar  avatar

Watchers

 avatar

Forkers

mazdaywik

mscp-a's Issues

Новый критерий обобщения

Свершилось: удалось доказать нётеровость любой последовательности однозначных образцов относительно вложения их языков. В связи с чем, поскольку точного критерия однозначности образца пока нет, в качестве временной меры действуем через линал.

  1. Разбиваем образец на фрагменты плоского разбиения
  2. Строим матрицу кратностей параметров типа выражение во фрагментах и находим её ранг
    Если ранг этой матрицы совпадает с числом параметров, обобщение делать не надо.

Интересно будет поэкспериментировать ещё с построением сливающих подстановок. Возможно, этот приём окажется более полезен именно там.

Подозрительный код

MSCP-A/Unfold_SCP.ref

Lines 182 to 187 in bf4a517

(Variable s.Sym t.name) e.other
, <Type t.name>: 'N'
= (Variable <Explode s.Sym> <Implode <Symb t.name>>)<TransformExpressionToPrefal e.other>;
(Variable s.Sym t.name) e.other
, <Type t.name>: 'D'
= (Variable <Explode s.Sym> <Implode <Symb t.name>>)<TransformExpressionToPrefal e.other>;

Функция Type возвращает тип, подтип и свой аргумент, т.е. как минимум 2 терма. Здесь её результат сверяется с одиночным символом, так что условие здесь никогда не выполняется.

Если вчитаться в правые части выражений, то видно, что в них ошибки. В первом предложении функции Implode передаётся строка из цифр, в то время как имя должно начинаться на букву. Во втором предложении функции Symb передаётся литера, что приводит к ошибке отождествления.

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

Лучше эти шесть строчек удалить.

Задача на верификацию

Придумал хорошую задачу на верификацию.

В своём фреймворке переписал разбор целого числа с контролем переполнения:

https://github.com/Mazdaywik/refal-5-framework/blob/171a994a1e0070f098f267ec6e65ad4ea5b8a4ed/lib/R5FW-Parser.ref#L60-L62

https://github.com/Mazdaywik/refal-5-framework/blob/171a994a1e0070f098f267ec6e65ad4ea5b8a4ed/lib/R5FW-Parser.ref#L151-L186

Переписать решил из-за того, что Рефал-05 не умеет работать с длинной арифметикой.

Почему-то интерфейс GitHub не хочет раскрывать ссылки выше в листинг, поэтому приведу код:

Код разбора целого числа
DoScan {
  …

  t.Pos (s.Digit e.Line) e.Lines,
      <Type s.Digit>: 'D0' s.Digit =
    <DoScan-Number t.Pos t.Pos (s.Digit) (e.Line) e.Lines>;

  …
}

DoScan-Number {
  t.Pos t.Start (e.Number) (s.Next e.Line) e.Lines
    , <Type s.Next>: 'D0' s.Next
    = <DoScan-Number
        <IncCol t.Pos> t.Start (<DropZero e.Number> s.Next) (e.Line) e.Lines
      >;

  t.Pos t.Start (e.Number) (e.Line) e.Lines
    = <CheckNumber t.Start e.Number>
      <DoScan t.Pos (e.Line) e.Lines>;
}

DropZero {
  '0' = /* пусто */;
  e.Number = e.Number;
}

MAX-MACRODIGIT { = '4294967295' }

CheckNumber {
  t.Pos e.Number
    , <CheckNumber-Compare
        <Ord (<Lenw e.Number>) (<Lenw <MAX-MACRODIGIT>>)>
      >
    : {
        '+' = (TkError t.Pos 'Very big numeric literal: ' e.Number);

        s.Other = (TkMacroDigit t.Pos <Numb e.Number>);
      }
}

CheckNumber-Compare {
  () () = '0';
  (s.Eq e.X) (s.Eq e.Y) = <CheckNumber-Compare (e.X) (e.Y)>;
  (s.X e.X) (s.Y e.Y) = <Compare s.X s.Y>;
}

Здесь важно, что функция CheckNumber может проверять число, в котором нет лидирующих нулей, что функция DoScan-Number должна обеспечить:

DoScan {
  …

  t.Pos (s.Digit e.Line) e.Lines,
      <Type s.Digit>: 'D0' s.Digit =
    <DoScan-Number t.Pos t.Pos (s.Digit) (e.Line) e.Lines>;

  …
}

DoScan-Number {
  t.Pos t.Start (e.Number) (s.Next e.Line) e.Lines
    , <Type s.Next>: 'D0' s.Next
    = <DoScan-Number
        <IncCol t.Pos> t.Start (<DropZero e.Number> s.Next) (e.Line) e.Lines
      >;

  t.Pos t.Start (e.Number) (e.Line) e.Lines
    = <CheckNumber t.Start e.Number>
      <DoScan t.Pos (e.Line) e.Lines>;
}

DropZero {
  '0' = /* пусто */;
  e.Number = e.Number;
}

Обеспечивается это при помощи DropZero. В результате CheckNumber получит или литеру '0', или последовательность литер, которая на '0' не начинается.

Написал модель для MSCP-A:

$ENTRY Test {
  s.Digit e.Digits = <DoScan-Number (s.Digit) e.Digits>;
}

DoScan-Number {
  (e.Number) s.Next e.Line
    = <DoScan-Number
        (<DropZero e.Number> s.Next) e.Line
      >;

  (e.Number) (EOF) = <Check-NoLeadingZero e.Number>;
}

DropZero {
  '0' = /* пусто */;
  e.Number = e.Number;
}

Check-NoLeadingZero {
  '0' = Ok;
  '0' e.X = Fail;
  e.X = Ok;
}

К сожалению, MSCP-A не смог доказать, что лидирующие нули исключаются:

$ENTRY Go {
 s.z1 e.x1 =  <DoScan-Number_12_0 () s.z1 (e.x1)>;
}


DoScan-Number_12_0 {
 (e.x1) s.z1 (s.z2 e.x2) =  <DoScan-Number_12_0 (<Let_1 (e.x1) s.z1>) s.z2 (e.x2)>;
 () '0' ((EOF)) =  Ok;
 ('0' e.x1) s.z1 ((EOF)) =  Fail;
 (e.x1) s.z1 ((EOF)) =  Ok;
}


Let_1 {
 () '0' = ;
 (e.x1) s.z1 =  e.x1 s.z1;
}

/* This file is generated by MSCP at Tue Oct 18 16:52:03 2022.*/

/* Elapsed time of embeddings is 0.0.*/

/* Elapsed time of generalizations is 0.0.*/

Пробовал и другие варианты обеспечить инвариант — тоже не получилось:

Вопросы:

  • Можно ли как-то переписать тестовый пример, чтобы инвариант обеспечивался?
  • Можно ли научить MSCP-A верифицировать эти примеры или выразительной силы рестрикций в уравнениях в словах тут недостаточно?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.