Реализован простейший язык для тестирования на зацикливания
От: GhostCoders Россия  
Дата: 01.03.09 00:43
Оценка: 4 (1) :))
Здраствуйте!

Реализовал транслятор простейшего языка программирования.
Для целей тестирования алгоритма, который определеят зависает ли определенная программа,
и если зависает то на каких наборах данных.

Вот описание языка:
* This is specification of Simple Language *
* Copyright (c) 2009 PETR PETROV *

* This is an example of comment *

* Please note that indentifiers are case-sentensive *

* now we declares subprogram *
SUBPROGRAM someSubProgram
* now we declares that our subprogram accepts "arg1" as argument and has int8 type (like "char" type in C) *
INPUT arg1 TYPE int8
* output variable *
OUTPUT res1 TYPE int8
* temporary variables (local variables) default values are zeros *
VAR temp0 TYPE int8
VAR temp1 TYPE int8
* subprogram body begins *
BEGIN
* set "temp1" variable to "13" value *
SET temp1 13
* declare label with name *
LABEL abc
* If arg1 == temp1 then goto label abc *
IFEQUAL arg1 temp1 GOTO abc EIF
* arg1 = arg1 — 1 *
DEC arg1
* res1 = res1 + 1 *
INC res1
* res1 = res1 + 1 *
INC res1
* If arg1 == temp0 then goto label end *
IFEQUAL arg1 temp0 GOTO end EIF
* goto abc *
GOTO abc
LABEL end
END

* PROGRAM is similar to SUBPROGRAM but defines the entry point of the application *
* PROGRAM must be single in entire file *
* input variables can be entered by user *

PROGRAM ProgramA
INPUT arg1 TYPE int8
OUTPUT res1 TYPE int8
VAR localVar TYPE int8
BEGIN
CALL someSubProgram arg1 res1
END

* some features of Simple Language *
SUBPROGRAM example
INPUT arg1 TYPE int8
OUTPUT res1 TYPE int8
VAR temp0 TYPE int8
BEGIN
* set the value of variable *
SET temp0 50
* res1 = arg1 *
LET res1 arg1
* if arg1 > arg1 then goto label1 else label2 *
IFGREAT arg1 arg2 GOTO label1 ELSE label2
* if arg1 < arg1 then goto label1 else label2 *
IFLESS arg1 arg2 GOTO label1 ELSE label2
* res1 = arg1 / temp0 *
DIV res1 arg1 temp0
* res1 = arg1 & temp0 *
MOD res1 arg1 temp0
* res1 = arg1 x temp0 *
MUL res1 arg1 temp0
* res1 = arg1 + temp0 *
ADD res1 arg1 temp0
* res1 = arg1 — temp0 *
SUB res1 arg1 temp0

* calling a subprogram someSubProgram(temp0,res1) *
CALL someSubProgram temp0 res1

END

Реализовал также и сам анализатор, который определяет зацикливается ли входной алгоритм или нет.

С Уважением,
Петр




01.03.09 15:35: Перенесено из 'Shareware и бизнес'
Третий Рим должен пасть!
Re: Реализован простейший язык для тестирования на зациклив
От: retalik www.airbandits.com/
Дата: 01.03.09 01:55
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здраствуйте!


И вам не хворать.
Можно объяснить, каким боком эта набившая оскомину тема относится к Shareware и бизнесу?
Успехов,
Виталий.
Re: Реализован простейший язык для тестирования на зациклив
От: Kubyshev Andrey  
Дата: 01.03.09 05:36
Оценка: :)
GC>Реализовал транслятор простейшего языка программирования.
GC>Для целей тестирования алгоритма, который определеят зависает ли определенная программа,
GC>и если зависает то на каких наборах данных.

Слушай, это случайно не твой сайт здесь ?
Re[2]: Реализован простейший язык для тестирования на зацик
От: FR  
Дата: 01.03.09 05:55
Оценка:
Здравствуйте, retalik, Вы писали:

R>И вам не хворать.

R>Можно объяснить, каким боком эта набившая оскомину тема относится к Shareware и бизнесу?

Его же в философии без соли съедят
Re: Реализован простейший язык для тестирования на зациклив
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 01.03.09 07:20
Оценка: +1 :))
Здравствуйте, GhostCoders, Вы писали:

GC>Реализовал транслятор простейшего языка программирования.


Очень хорошо. Теперь нужно перевести на этот язык вот эту простейшую функцию:
http://rsdn.ru/forum/Default.aspx?mid=3307978
Автор: RomikT
Дата: 27.02.09

и узнать, наконец-то ответ!

GC>* now we declares subprogram *


Лучше бы по-русски писал, все равно это не английский.
Re[2]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 09:30
Оценка: 8 (2)
Здравствуйте, D. Mon, Вы писали:

DM>Здравствуйте, GhostCoders, Вы писали:


GC>>Реализовал транслятор простейшего языка программирования.


DM>Очень хорошо. Теперь нужно перевести на этот язык вот эту простейшую функцию:

DM>http://rsdn.ru/forum/Default.aspx?mid=3307978
Автор: RomikT
Дата: 27.02.09

DM>и узнать, наконец-то ответ!

Вот пример данной функции на этом языке:

* This is function from RomikT *

PROGRAM RomikT
INPUT n TYPE int8
OUTPUT res TYPE int8
VAR value_1 TYPE int8
VAR value_2 TYPE int8
VAR value_3 TYPE int8
VAR value_0 TYPE int8
VAR temp0 TYPE int8
BEGIN
SET value_1 1
SET value_2 2
SET value_3 3
SET value_0 0
LABEL while_cycle
IFEQUAL n value_1 GOTO end EIF
MOD temp0 n value_2
IFEQUAL temp0 value_0 GOTO _even EIF
MUL n n value_3
INC n
GOTO c_cont
LABEL _even
DIV n n value_2
LABEL c_cont
GOTO while_cycle
LABEL end
LET res n
END

Вот результат работы моего анализатора (только первая часть, так как случаев с зависанием много):
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 0
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 15
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 23
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 30
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 35
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 39
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 45
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 46
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 49
HALT HAS BEEN DETECTED.
INPUT VARIABLES:
n = 53

.... и т.д.
и в конце немного "статистики".
RESULTS:
total : 256
halted: 146
passed: 110
Q = 0.570313 (то самое "магическое" омега, которое было описано здесь: http://elementy.ru/lib/430319)
Третий Рим должен пасть!
Re[2]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 09:34
Оценка:
Здравствуйте, Kubyshev Andrey, Вы писали:

GC>>Реализовал транслятор простейшего языка программирования.

GC>>Для целей тестирования алгоритма, который определеят зависает ли определенная программа,
GC>>и если зависает то на каких наборах данных.

KA>Слушай, это случайно не твой сайт здесь ?

Нет, сайт не мой, но сайт моего партнера здесь http://www.pdf3d.co.uk
Третий Рим должен пасть!
Re[3]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 09:36
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, retalik, Вы писали:


R>>И вам не хворать.

R>>Можно объяснить, каким боком эта набившая оскомину тема относится к Shareware и бизнесу?

FR>Его же в философии без соли съедят


Вообще можно даже этот топик и в философию перенести. Думаю что так будет обсуждение конструктивней.
Но дело в том что философия абстрактна и фантазийна, а мой метод рабочий (хотя конечно и с ограничениями).
Третий Рим должен пасть!
Re[3]: Реализован простейший язык для тестирования на зацик
От: Аноним  
Дата: 01.03.09 10:48
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, D. Mon, Вы писали:


DM>>Здравствуйте, GhostCoders, Вы писали:


GC>>>Реализовал транслятор простейшего языка программирования.


DM>>Очень хорошо. Теперь нужно перевести на этот язык вот эту простейшую функцию:

DM>>http://rsdn.ru/forum/Default.aspx?mid=3307978
Автор: RomikT
Дата: 27.02.09

DM>>и узнать, наконец-то ответ!

GC>Вот пример данной функции на этом языке:


GC>* This is function from RomikT *


GC>PROGRAM RomikT

GC>INPUT n TYPE int8

Как бы так помягче выразиться.. С какого перепугу N тут int8? "Анализатор" тупо перебирает все возможные значения входных параметров??

Автор, это уже не смешно. Реальная клиника.
Re: Реализован простейший язык для тестирования на зациклив
От: Alexey F  
Дата: 01.03.09 10:54
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Реализовал транслятор простейшего языка программирования.

GC>Для целей тестирования алгоритма, который определеят зависает ли определенная программа,
GC>и если зависает то на каких наборах данных.

Интересно получилось И так быстро!
Так что там с одним из предложенных тестовых заданиий
Автор: Alexey F
Дата: 28.02.09
:

"Если где-либо в дробной части числа "пи" встречается последовательность цифр 84327411834783744390087539249 — завершить цикл"

?
Что на это скажет анализатор?
Re[4]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 10:58
Оценка: :))
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, GhostCoders, Вы писали:


GC>>Здравствуйте, D. Mon, Вы писали:


DM>>>Здравствуйте, GhostCoders, Вы писали:


GC>>>>Реализовал транслятор простейшего языка программирования.


DM>>>Очень хорошо. Теперь нужно перевести на этот язык вот эту простейшую функцию:

DM>>>http://rsdn.ru/forum/Default.aspx?mid=3307978
Автор: RomikT
Дата: 27.02.09

DM>>>и узнать, наконец-то ответ!

GC>>Вот пример данной функции на этом языке:


GC>>* This is function from RomikT *


GC>>PROGRAM RomikT

GC>>INPUT n TYPE int8

А>Как бы так помягче выразиться.. С какого перепугу N тут int8? "Анализатор" тупо перебирает все возможные значения входных параметров??


А почему бы и нет?
Третий Рим должен пасть!
Re: Реализован простейший язык для тестирования на зациклив
От: PolyTech Россия https://vmpsoft.com
Дата: 01.03.09 11:05
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Реализовал транслятор простейшего языка программирования.


Мне почему-то сразу вот это напомнило:
http://www.rus-os.narod.ru
Re[2]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 11:06
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, GhostCoders, Вы писали:


GC>>Реализовал транслятор простейшего языка программирования.

GC>>Для целей тестирования алгоритма, который определеят зависает ли определенная программа,
GC>>и если зависает то на каких наборах данных.

AF>Интересно получилось И так быстро!

AF>Так что там с одним из предложенных тестовых заданиий
Автор: Alexey F
Дата: 28.02.09
:

AF>

AF>"Если где-либо в дробной части числа "пи" встречается последовательность цифр 84327411834783744390087539249 — завершить цикл"

AF>?
AF>Что на это скажет анализатор?

понимаете, тут какое дело. В реальной программе, мы будем использовать тот же float,
который имеет 32-бита, и имеет ограничение на число знаков после запятой.

Мой анализатор проверит это дело, то только до того знака, до которого позволяет float.

Можно использовать double, точность болше, знаков после запятой тоже. Но число знаков тоже КОНЕЧНО.

По хорошему, мы должны использовать переменную с бесконечным числом бит, но
у нас никогда не будет компьютера с бесконечной памятью. Машина Тьюринга, имеет бесконечную память.
Третий Рим должен пасть!
Re[2]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 11:07
Оценка:
Здравствуйте, PolyTech, Вы писали:

PT>Здравствуйте, GhostCoders, Вы писали:


GC>>Реализовал транслятор простейшего языка программирования.


PT>Мне почему-то сразу вот это напомнило:

PT>http://www.rus-os.narod.ru

а мне нет
Третий Рим должен пасть!
Re[3]: Реализован простейший язык для тестирования на зацик
От: Alexey F  
Дата: 01.03.09 11:12
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>По хорошему, мы должны использовать переменную с бесконечным числом бит, но

GC>у нас никогда не будет компьютера с бесконечной памятью. Машина Тьюринга, имеет бесконечную память.

Пардон, всё же мне надо чётче формулировать свои мысли
Число "пи" было взято как пример числа, вычисление которого с бесконечной точностью занимает бесконечное время, причём мы не можем предугадать, какое число появится следующим при следующей итерации вычислений. Ближайший аналог — ГСЧ, если условиться, что генерируемые им числа не предсказуемы.
Т.е.:
// Якобы, следующее число в "пи" :)
int getNextNumberInPi () {
    return std::rand () % 10;
}

будет достаточно
Re[4]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 11:16
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, GhostCoders, Вы писали:


GC>>По хорошему, мы должны использовать переменную с бесконечным числом бит, но

GC>>у нас никогда не будет компьютера с бесконечной памятью. Машина Тьюринга, имеет бесконечную память.

AF>Пардон, всё же мне надо чётче формулировать свои мысли

AF>Число "пи" было взято как пример числа, вычисление которого с бесконечной точностью занимает бесконечное время, причём мы не можем предугадать, какое число появится следующим при следующей итерации вычислений. Ближайший аналог — ГСЧ, если условиться, что генерируемые им числа не предсказуемы.

Вот только если условиться. На самом деле, если не использовать никаких апаратных средств (использование ввода пользователя), а только обходиться исключительно самой программой для генерации случайных чисел ->
это генерация псевдослучайных чисел.

Тем более если "пи" вычисляется с бесконечной точностью бесконечное время то необходимо сохранять результат вычислений,
а на это потребуется бесконечная память.
Третий Рим должен пасть!
Re[5]: Реализован простейший язык для тестирования на зацик
От: Alexey F  
Дата: 01.03.09 11:23
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Вот только если условиться. На самом деле, если не использовать никаких апаратных средств (использование ввода пользователя), а только обходиться исключительно самой программой для генерации случайных чисел ->

GC>это генерация псевдослучайных чисел.
Конечно условиться Эта условность накладывает ограничение на анализатор — он не должен знать устройство getNextNumberInPi.


GC>Тем более если "пи" вычисляется с бесконечной точностью бесконечное время то необходимо сохранять результат вычислений,

GC>а на это потребуется бесконечная память.
Зря я "пи" в пример привёл
Представьте себе, что есть некая волшебная функция getNextNumberInPi, которая возвращает очередное дробное число в числе "пи" (может, это число считает пользователь и по одной цифре с клавиатуры вводит ). Для того, чтобы узнать:

встречается последовательность цифр 8432741183478374439008753924

или нет, нам потребуется буфер для хранения всего лишь strlen ( "8432741183478374439008753924" ) == 28 символов. Первый же несовпавший символ очищает буфер и всё начинается сначала.
Re[6]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 11:25
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, GhostCoders, Вы писали:


GC>>Тем более если "пи" вычисляется с бесконечной точностью бесконечное время то необходимо сохранять результат вычислений,

GC>>а на это потребуется бесконечная память.
AF>Зря я "пи" в пример привёл
AF>Представьте себе, что есть некая волшебная функция getNextNumberInPi, которая возвращает очередное дробное число в числе "пи" (может, это число считает пользователь и по одной цифре с клавиатуры вводит ). Для того, чтобы узнать:
AF>

AF>встречается последовательность цифр 8432741183478374439008753924

AF>или нет, нам потребуется буфер для хранения всего лишь strlen ( "8432741183478374439008753924" ) == 28 символов. Первый же несовпавший символ очищает буфер и всё начинается сначала.

Вопрос в том существует ли алгоритм нахождения числа "пи", который не использует предыдущие числа для
вычисления следующего.
Третий Рим должен пасть!
Re[3]: Реализован простейший язык для тестирования на зацик
От: FR  
Дата: 01.03.09 11:37
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>понимаете, тут какое дело. В реальной программе, мы будем использовать тот же float,

GC>который имеет 32-бита, и имеет ограничение на число знаков после запятой.

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 123 ** 123
11437436793461719009988029522806627674621807845185022977588797505236950478566689
64466065683652015421696499747277306288423453431965811348959199428208744498372120
99476648958359023796078549041949007807220625356526926729664064846685758382803707
100766740220839267L
Re[3]: Реализован простейший язык для тестирования на зацик
От: 0K Ниоткуда  
Дата: 01.03.09 11:38
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>понимаете, тут какое дело. В реальной программе, мы будем использовать тот же float,

GC>который имеет 32-бита, и имеет ограничение на число знаков после запятой.

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

GC>Мой анализатор проверит это дело, то только до того знака, до которого позволяет float.


Насколько быстрее чем методом простого перебора, к примеру?

GC>По хорошему, мы должны использовать переменную с бесконечным числом бит, но

GC>у нас никогда не будет компьютера с бесконечной памятью. Машина Тьюринга, имеет бесконечную память.

А если не бесконечное чило бит а просто очень большое? Определить зацикливание не сложно... Видимо все дело в скорости... Насколько быстр ваш алгоритм?
Re[4]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 11:40
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, GhostCoders, Вы писали:


GC>>понимаете, тут какое дело. В реальной программе, мы будем использовать тот же float,

GC>>который имеет 32-бита, и имеет ограничение на число знаков после запятой.

FR>
FR>Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
FR>win32
FR>Type "help", "copyright", "credits" or "license" for more information.
>>>> 123 ** 123
FR>11437436793461719009988029522806627674621807845185022977588797505236950478566689
FR>64466065683652015421696499747277306288423453431965811348959199428208744498372120
FR>99476648958359023796078549041949007807220625356526926729664064846685758382803707
FR>100766740220839267L
FR>


Число большое, да, это правда, больше чем float. Но питон все равно имеет ограничение в размере ОЗУ,
например, не умеет обрабатывать числа, которые занимают памяти больше чем все ОЗУ компьютера (и жесткого диска).
Третий Рим должен пасть!
Re[7]: Реализован простейший язык для тестирования на зацик
От: Alexey F  
Дата: 01.03.09 11:41
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Вопрос в том существует ли алгоритм нахождения числа "пи", который не использует предыдущие числа для

GC>вычисления следующего.

Как я уже говорил, пользователь может вводить каждое новое число с клавиатуры, не в этом дело
Вот пример на C++ (написан на скорую руку, упрощённый; на самом деле, буфер там не к месту — можно было обойтись и без него):
// Получение следующего числа в дробной части "пи" (чёрный ящик):
char getNextNumberInPi () {
    char digit = 0;
    for ( ;; ) {
        std::cin >> digit;
        if ( std::isdigit ( digit ) ) {
            return digit;
        }
        std::cout << "Retype! No digit in input." << std::endl;
    }
}

// Необходимая последовательность и её длина:
char const needSequence[] = "8432741183478374439008753924";
std::size_t const needLength = std::strlen ( needSequence );

int main () {
    // Можно было сделать проще и без буфера:
    std::vector<char> buffer;
    for ( ;; ) {
        // Новое число в конец буфера:
        buffer.push_back ( getNextNumberInPi () );
        // Если нет точного совпадения - очищаем буфер:
        if ( !std::equal ( buffer.begin (), buffer.end (), needSequence ) ) {
            buffer.clear ();
        }
        // Если совпадение есть и буфер достиг нужного размера - останавливаемся:
        else if ( buffer.size () == needLength ) {
            std::cout << "Stopped!" << std::endl;
            return 0;
        }
    }
}
Re[4]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 11:44
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, GhostCoders, Вы писали:


GC>>понимаете, тут какое дело. В реальной программе, мы будем использовать тот же float,

GC>>который имеет 32-бита, и имеет ограничение на число знаков после запятой.

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


Неправда. Массивы в наших компьютерах всегда имееют ограниченный размер. Например, на 32-разрядной ОС
массив не может быть больше 4G.

GC>>Мой анализатор проверит это дело, то только до того знака, до которого позволяет float.


0K>Насколько быстрее чем методом простого перебора, к примеру?


GC>>По хорошему, мы должны использовать переменную с бесконечным числом бит, но

GC>>у нас никогда не будет компьютера с бесконечной памятью. Машина Тьюринга, имеет бесконечную память.

0K>А если не бесконечное чило бит а просто очень большое? Определить зацикливание не сложно... Видимо все дело в скорости... Насколько быстр ваш алгоритм?


"Определить зацикливание не сложно... " — то есть Вы утверждаете что Тьюринг не прав?
Все таки можно определить зацикливание?
Третий Рим должен пасть!
Re[8]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 11:51
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, GhostCoders, Вы писали:


GC>>Вопрос в том существует ли алгоритм нахождения числа "пи", который не использует предыдущие числа для

GC>>вычисления следующего.

AF>Как я уже говорил, пользователь может вводить каждое новое число с клавиатуры, не в этом дело

AF>Вот пример на C++ (написан на скорую руку, упрощённый; на самом деле, буфер там не к месту — можно было обойтись и без него):
AF>
AF>// Получение следующего числа в дробной части "пи" (чёрный ящик):
AF>char getNextNumberInPi () {
AF>    char digit = 0;
AF>    for ( ;; ) {
AF>        std::cin >> digit;
AF>        if ( std::isdigit ( digit ) ) {
AF>            return digit;
AF>        }
AF>        std::cout << "Retype! No digit in input." << std::endl;
AF>    }
AF>}

AF>// Необходимая последовательность и её длина:
AF>char const needSequence[] = "8432741183478374439008753924";
AF>std::size_t const needLength = std::strlen ( needSequence );

AF>int main () {
AF>    // Можно было сделать проще и без буфера:
AF>    std::vector<char> buffer;
AF>    for ( ;; ) {
AF>        // Новое число в конец буфера:
AF>        buffer.push_back ( getNextNumberInPi () );
AF>        // Если нет точного совпадения - очищаем буфер:
AF>        if ( !std::equal ( buffer.begin (), buffer.end (), needSequence ) ) {
AF>            buffer.clear ();
AF>        }
AF>        // Если совпадение есть и буфер достиг нужного размера - останавливаемся:
AF>        else if ( buffer.size () == needLength ) {
AF>            std::cout << "Stopped!" << std::endl;
AF>            return 0;
AF>        }
AF>    }
AF>}
AF>


Вы сами понимаете что ввод пользователя привносит новую информацию в программу. Пользователь находится вне вычислительной системы, и предугадать его поведение не возможно.
Идет речь о "закрытых" участках кода, в которые информация из внешнего мира не поступает,
а только обрабатываются.
Третий Рим должен пасть!
Re[5]: Реализован простейший язык для тестирования на зацик
От: FR  
Дата: 01.03.09 11:59
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Число большое, да, это правда, больше чем float. Но питон все равно имеет ограничение в размере ОЗУ,

GC>например, не умеет обрабатывать числа, которые занимают памяти больше чем все ОЗУ компьютера (и жесткого диска).

Твой алгоритм явно нелинейный, так что будем ждать для любого нетривиального кода миллард-другой лет?
Re[7]: Реализован простейший язык для тестирования на зацик
От: FR  
Дата: 01.03.09 12:01
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

GC>Вопрос в том существует ли алгоритм нахождения числа "пи", который не использует предыдущие числа для

GC>вычисления следующего.

Про пи не знаю но тот же Аттрактор Лоренца не требует дополнительной памяти и при этом псевдослучаен. Да и теже детерминированные фракталы тоже можно вычислять на ограниченой памяти.
Re[5]: Реализован простейший язык для тестирования на зацик
От: Аноним  
Дата: 01.03.09 12:04
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>"Определить зацикливание не сложно... " — то есть Вы утверждаете что Тьюринг не прав?

GC>Все таки можно определить зацикливание?

Определим понятие "возможности" как "анализатору в худшем случае требуется меньше 10 лет чтобы выдать результат на самом производительном суперкомпьютере из существующих". Так понятнее?

А говорят еще индусы злодеи. Хотя кто знает, может под ником GhostCoders какой-нибудь Брахмапутра тут решил над народом поиздеваться
Re[8]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 12:07
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, GhostCoders, Вы писали:


GC>>Вопрос в том существует ли алгоритм нахождения числа "пи", который не использует предыдущие числа для

GC>>вычисления следующего.

FR>Про пи не знаю но тот же Аттрактор Лоренца не требует дополнительной памяти и при этом псевдослучаен. Да и теже детерминированные фракталы тоже можно вычислять на ограниченой памяти.


Только ПСЕВдослучаен.
Третий Рим должен пасть!
Re[2]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 12:09
Оценка:
Здравствуйте, PolyTech, Вы писали:

PT>Здравствуйте, GhostCoders, Вы писали:


GC>>Реализовал транслятор простейшего языка программирования.


PT>Мне почему-то сразу вот это напомнило:

PT>http://www.rus-os.narod.ru


Никакой это не вечный двигатель. Вы просто некомпетентны в этом вопросе.
Не знаете простых вещей

Например здесь
http://en.wikipedia.org/wiki/Halting_problem

в разделе "Common pitfalls" (Распространенные заблуждения)
указывается что проблема останова РАЗРЕШИМА для машин с конечным набором состояний.
Машина Тьюринга является машиной с бесконечным числом состояний.
То есть не я первый это придумал. А придумал это Minsky в 1967 году.

Так что АНАЛИЗАТОР теоритически возможен, а на практике будет иметь существенные огранияения, это, да, правда,
с этим согласен.

Русская wikki все-таки является неполной по сравнению с английской.
Третий Рим должен пасть!
Re[6]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 12:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, GhostCoders, Вы писали:


GC>>"Определить зацикливание не сложно... " — то есть Вы утверждаете что Тьюринг не прав?

GC>>Все таки можно определить зацикливание?

А>Определим понятие "возможности" как "анализатору в худшем случае требуется меньше 10 лет чтобы выдать результат на самом производительном суперкомпьютере из существующих". Так понятнее?


В этом случае время работы конечно, и АНАЛИЗАТОР возможен
Третий Рим должен пасть!
Re[7]: Реализован простейший язык для тестирования на зацик
От: Аноним  
Дата: 01.03.09 12:13
Оценка: +1 -1
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, GhostCoders, Вы писали:


GC>>>"Определить зацикливание не сложно... " — то есть Вы утверждаете что Тьюринг не прав?

GC>>>Все таки можно определить зацикливание?

А>>Определим понятие "возможности" как "анализатору в худшем случае требуется меньше 10 лет чтобы выдать результат на самом производительном суперкомпьютере из существующих". Так понятнее?


GC>В этом случае время работы конечно, и АНАЛИЗАТОР возможен


Вон из профессии.
Re[5]: Реализован простейший язык для тестирования на зацик
От: 0K Ниоткуда  
Дата: 01.03.09 12:13
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

0K>>А если не бесконечное чило бит а просто очень большое? Определить зацикливание не сложно... Видимо все дело в скорости... Насколько быстр ваш алгоритм?


GC>"Определить зацикливание не сложно... " — то есть Вы утверждаете что Тьюринг не прав?

GC>Все таки можно определить зацикливание?

Конечно можно. Запустить и подождать 1 * 10^n лет. Если получен ответ -- значит не зациклился.

Ценность в том, чтобы определить это с определенной скоростью. Для простых случаев, типа деления на нуль, это сделать не сложно. Есть ли универсальный способ для всех алгоритмов (кроме как запустить и подождать пару мильярдов лет)? Видимо об этом Тьюринг и говорил...

Насколько ваш алгоритм быстрее простого ожидания возврата из цикла?
Re[7]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 01.03.09 12:19
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Вопрос в том существует ли алгоритм нахождения числа "пи", который не использует предыдущие числа для

GC>вычисления следующего.
Да. Такие алгоритмы есть для десятичной и двоичной баз (и для ряда других).
Sapienti sat!
Re[9]: Реализован простейший язык для тестирования на зацик
От: FR  
Дата: 01.03.09 12:21
Оценка:
Здравствуйте, GhostCoders, Вы писали:

FR>>Про пи не знаю но тот же Аттрактор Лоренца не требует дополнительной памяти и при этом псевдослучаен. Да и теже детерминированные фракталы тоже можно вычислять на ограниченой памяти.


GC>Только ПСЕВдослучаен.


Угу, только есть пробема чтобы узнать эту псевдослучайную последовательность ее надо вычислять, а сходимость в заисимости от начальных условий, на современых машинах, у тех же аттракторов может быть от долей секунд до миллиардов лет.
Re[8]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 12:23
Оценка: -2
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, GhostCoders, Вы писали:


GC>>Здравствуйте, Аноним, Вы писали:


А>>>Здравствуйте, GhostCoders, Вы писали:


GC>>>>"Определить зацикливание не сложно... " — то есть Вы утверждаете что Тьюринг не прав?

GC>>>>Все таки можно определить зацикливание?

А>>>Определим понятие "возможности" как "анализатору в худшем случае требуется меньше 10 лет чтобы выдать результат на самом производительном суперкомпьютере из существующих". Так понятнее?


GC>>В этом случае время работы конечно, и АНАЛИЗАТОР возможен


А>Вон из профессии.


Сам пшел вон.

Учи компьютерную азбуку. А наверное бывший ветеринар программирует тут.
Третий Рим должен пасть!
Re[6]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 12:23
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, GhostCoders, Вы писали:


0K>>>А если не бесконечное чило бит а просто очень большое? Определить зацикливание не сложно... Видимо все дело в скорости... Насколько быстр ваш алгоритм?


GC>>"Определить зацикливание не сложно... " — то есть Вы утверждаете что Тьюринг не прав?

GC>>Все таки можно определить зацикливание?

0K>Конечно можно. Запустить и подождать 1 * 10^n лет. Если получен ответ -- значит не зациклился.


Нет, определить что алгоритм зациклился можно и намного раньше.

Вы просто некомпетентны в этом вопросе.
Не знаете простых вещей

Например здесь
http://en.wikipedia.org/wiki/Halting_problem

в разделе "Common pitfalls" (Распространенные заблуждения)
указывается что проблема останова РАЗРЕШИМА для машин с конечным набором состояний.
Машина Тьюринга является машиной с бесконечным числом состояний.
То есть не я первый это придумал. А придумал это Minsky в 1967 году.

Так что АНАЛИЗАТОР теоритически возможен, а на практике будет иметь существенные огранияения, это, да, правда,
с этим согласен.

Русская wikki все-таки является неполной по сравнению с английской.

0K>Ценность в том, чтобы определить это с определенной скоростью. Для простых случаев, типа деления на нуль, это сделать не сложно. Есть ли универсальный способ для всех алгоритмов (кроме как запустить и подождать пару мильярдов лет)? Видимо об этом Тьюринг и говорил...


Нет, Тьюринг говорил об другом. Он говорил, что вообще невозможно построить АНАЛИЗАТОР в принципе (для машины Тьюринга).

На практике (я имею в виду разумные ограничения по времени) можно использовать приемы "разделяй и властвуй" и подобные.
Третий Рим должен пасть!
Re[3]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 01.03.09 12:28
Оценка: 2 (1) +2
Здравствуйте, GhostCoders, Вы писали:

GC>в разделе "Common pitfalls" (Распространенные заблуждения)

GC>указывается что проблема останова РАЗРЕШИМА для машин с конечным набором состояний.
GC>Машина Тьюринга является машиной с бесконечным числом состояний.
GC>То есть не я первый это придумал. А придумал это Minsky в 1967 году.
Любые реальные компьютеры — это не машины Тьюринга, а конечные автоматы. Так что, теоретически, мы можем просто перебрать все их возможные состояния. Их количество ограничено так называемым числом "Busy beaver" (http://en.wikipedia.org/wiki/Busy_Beaver).

Вот только это число растёт просто НЕВООБРАЗИМО быстро. Для машины Тьюринга с лентой из 6 элементов _нижняя_ граница составляет 10^1439 шагов (другой автор цитирует 4096 ^^ 166).

Причём не существует общих способов анализа проблемы останова для алгоритма, работающих за меньшее число шагов, чем сам алгоритм. Т.е. тебе для анализа вполне вероятно может потребоваться выполнить эти 10^1439 шагов.

Так что любой общий алгоритм анализа — это изобретение вечного двигателя.
Sapienti sat!
Re[6]: Реализован простейший язык для тестирования на зацик
От: g_i  
Дата: 01.03.09 12:29
Оценка:
Здравствуйте, 0K, Вы писали:

0K> Есть ли универсальный способ для всех алгоритмов (кроме как запустить и подождать пару мильярдов лет)? Видимо об этом Тьюринг и говорил...


Боюсь, что пары миллиардов лет может нехватить. Насколько я помню, доказано, что невозможно построить машину тьюринга которая гарантированно определяет завершит любая другая машина тьюринга когда-либо работу или нет.
Re: в КУ было...
От: Alexander G Украина  
Дата: 01.03.09 12:33
Оценка: 1 (1) +1
http://www.rsdn.ru/forum/message/3190404.1.aspx
Автор: CiViLiS
Дата: 27.11.08
Русский военный корабль идёт ко дну!
Re[4]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 12:34
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, GhostCoders, Вы писали:


GC>>в разделе "Common pitfalls" (Распространенные заблуждения)

GC>>указывается что проблема останова РАЗРЕШИМА для машин с конечным набором состояний.
GC>>Машина Тьюринга является машиной с бесконечным числом состояний.
GC>>То есть не я первый это придумал. А придумал это Minsky в 1967 году.
C>Любые реальные компьютеры — это не машины Тьюринга, а конечные автоматы. Так что, теоретически, мы можем просто перебрать все их возможные состояния. Их количество ограничено так называемым числом "Busy beaver" (http://en.wikipedia.org/wiki/Busy_Beaver).

C>Вот только это число растёт просто НЕВООБРАЗИМО быстро. Для машины Тьюринга с лентой из 6 элементов _нижняя_ граница составляет 10^1439 шагов (другой автор цитирует 4096 ^^ 166).


Это зависит от числа возможных состояний головки машины Тьюринга. Чем оно больше тем больше шагов.

C>Причём не существует общих способов анализа проблемы останова для алгоритма, работающих за меньшее число шагов, чем сам алгоритм. Т.е. тебе для анализа вполне вероятно может потребоваться выполнить эти 10^1439 шагов.


А за большее число шагов или за равное — существуют такие алгоритмы.

C>Так что любой общий алгоритм анализа — это изобретение вечного двигателя.

Тут я с вами не соглачен. Обший алгоритм анализа существует. Почему? Ответите аргументорованно?
Третий Рим должен пасть!
Re[9]: Реализован простейший язык для тестирования на зацик
От: Alexey F  
Дата: 01.03.09 12:42
Оценка:
Здравствуйте, GhostCoders, Вы писали:

Простите, наверное, я начинаю уже Вас раздражать, но...
Итак, прежде, чем начать: я ни в коей мере не сомневаюсь в Ваших профессиональных способностях и не стремлюсь Вас задеть или оскорбить (я сам такой — каааак заболею идеей, так всё (последней болезнью у меня был архиватор, сжимающий любую последовательность в функцию ) ). О причинах, по которых я это всё пишу — см. ниже.

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

Конечно я понимаю! Я к этому и веду // Хотя в случае с числом "пи" результат от пользователя (который никогда не ошибается и не пытается вводить неправильные числа) как раз детерминирован.

GC>Идет речь о "закрытых" участках кода, в которые информация из внешнего мира не поступает,

GC>а только обрабатываются.
Это и есть частные случаи, о который я говорил с самого начала.

Из Ваших ответов:

LF>Вы хотите сказать, что разрешили неразрешимую проблему?

Получается что так.

Получено решение не для общего случая, а для частного — когда система "замкнута". Неразрешимая проблема осталась таковой.

F>Что вы хотите услышать? Что разработчик, скачав утилиту и натравив ее на исходный код, получит (если получит) неоднозначные результаты и за это еще денег надо будет отвалить?

Вся фишка в том, что результаты будут 100% однозначные и 100% достоверные.

// Флейм пошёл из-за уверености в выделенном.
Полный перебор всех вариантов даст 100% однозначные и достоверные результаты, но "кому это надо" (c)? Если метод через 100 лет выдаст результат, что программа не зациклится, что с ним будут делать пра-правнуки того программиста, что запустил задачу на выполнение? А если алгоритм зацикливается и результаты его предсказать нельзя (скажем, алгоритм пользуется неким ГПСЧ, обладающий очень долго вычисляющимся алгоритмом (неупрощаемым) и проще запустить этот ГПСЧ и получить результат, чем пытаться предсказать (траты времени будут соответствующие))? Остановится через бесконечное время?

P.S.:

Например здесь
http://en.wikipedia.org/wiki/Halting_problem

в разделе "Common pitfalls" (Распространенные заблуждения)
указывается что проблема останова РАЗРЕШИМА для машин с конечным набором состояний.
Машина Тьюринга является машиной с бесконечным числом состояний.




здесь же:

Устройство машины Тьюринга

В состав машины Тьюринга входит бесконечная в обе стороны лента (возможны машины Тьюринга, которые имеют несколько бесконечных лент), разделённая на ячейки, и управляющее устройство, способное находиться в одном из множества состояний. Число возможных состояний управляющего устройства конечно и точно задано.




Лично я пытаюсь отговорить Вас от попытки распространить решение на все случаи и создавать некий инструмент, который будет 100% выдавать правильный результат. Число случаев использования такого инструмента будет сильно ограничено (мало разрабатываемых систем являются "закрытыми" без поступления внешних данных, а те элементарные функции, на которые можно будет анализатор натравить... Стоит ли овчинка выделки?).
Однако, раз Вы уж занялись этой проблемой, то у Вас может получится отличный полуавтоматический генератор юнит-тестов, который не будет выдавать информацию зациклилось/не зациклилось, а просто прогонит функцию по наибольшему количеству нужных данных :
int func ( int const arg ) {
    if ( arg < 2 ) {
       return -1;
    }
    else if ( arg * 2 > 15 ) {
        return 8;
    }
    else {
        return 5;
    }
}

А вот какой может получиться тест:
template<>
template<>
void object::test<1> () {
    set_test_name ( "int func ( int )" );
    ensure_equals ( func ( 0 ), -1 );
    ensure_equals ( func ( 10 ), 8 );
    ensure_equals ( func ( 4 ), 5 );
}

ИМХО, при рефакторинге такая штучка могла бы помочь... Вот только про её комерческую пользу — .
Re[2]: в КУ было...
От: Alexey F  
Дата: 01.03.09 12:47
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>http://www.rsdn.ru/forum/message/3190404.1.aspx
Автор: CiViLiS
Дата: 27.11.08

Аааа, после того топика мне в голову пришла мысль о анализаторе, примерно о таком же, о котором пишет GhostCoders Перебор осмысленных вариантов на основе условий выполнения и условий циклов внутри тестируемой функции Только мысль была отметена за минуту
Re[3]: Реализован простейший язык для тестирования на зацик
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 01.03.09 12:55
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Вот пример данной функции на этом языке:

GC>* This is function from RomikT *

Спасибо, что не поленился перевести!
А можно теперь условие n!=1 заменить на n>1 (RomikT там накосячил), и тип данных заменить на целые числа (или хотя бы 64-битные)?

Фишка исходной задачи тут:
http://en.wikipedia.org/wiki/Collatz_conjecture
http://mathworld.wolfram.com/CollatzProblem.html
если решишь для случая целых чисел (в математическом смысле), 1000 фунтов стерлингов получишь сразу, другие премии позже.
Re[5]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 01.03.09 13:05
Оценка:
Здравствуйте, GhostCoders, Вы писали:

C>>Вот только это число растёт просто НЕВООБРАЗИМО быстро. Для машины Тьюринга с лентой из 6 элементов _нижняя_ граница составляет 10^1439 шагов (другой автор цитирует 4096 ^^ 166).

GC>Это зависит от числа возможных состояний головки машины Тьюринга. Чем оно больше тем больше шагов.
Для любого реального компьютера это число будет таким, что я даже не знаю как его записать.

C>>Причём не существует общих способов анализа проблемы останова для алгоритма, работающих за меньшее число шагов, чем сам алгоритм. Т.е. тебе для анализа вполне вероятно может потребоваться выполнить эти 10^1439 шагов.

GC>А за большее число шагов или за равное — существуют такие алгоритмы.
Тогда проще запустить сам алгоритм.

C>>Так что любой общий алгоритм анализа — это изобретение вечного двигателя.

GC>Тут я с вами не соглачен. Обший алгоритм анализа существует. Почему? Ответите аргументорованно?
Приведите пример решения двух простых задач: http://rsdn.ru/forum/message/3308701.1.aspx
Автор: Cyberax
Дата: 01.03.09
Sapienti sat!
Re[4]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 13:31
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Здравствуйте, GhostCoders, Вы писали:



DM>Фишка исходной задачи тут:

DM>http://en.wikipedia.org/wiki/Collatz_conjecture
DM>http://mathworld.wolfram.com/CollatzProblem.html
DM>если решишь для случая целых чисел (в математическом смысле), 1000 фунтов стерлингов получишь сразу, другие премии позже.

Доказывается элементарно.

Скажем если число N — четно, то оно уменьшается в два раза. То есть стремиться к единице. Тут все оцевидно.


Если число нечетно, то нечетно число O можно представить через четное число E следующим образом:

O = 2 * E + 1.

(Скажем 17 можно представить как 2 * 8 + 1), где O = 17, E = 8.

Для нечетных чисел производиться операция N = 3 * N + 1, то есть имеем следующее

O* = 3 * (2 * E + 1) + 1 = 6 * E + 3 + 1 = 6 * E + 4;

то есть на следующей итерации имеем число O* = 6 * E + 4;
Но оно всегда будет четным, так как если четно Е, то умножение четного числа на любое другое число
дает четное число, придавление 4 картины не изменеят, так как 4 — четное.

Следовательно, следующий шаг деление на 2.

Имеем O** = 3 * E + 2.
Число O** — тоже четное по тем же причинам.

Следовательно, следующий шаг деление на 2.
Имеем O*** = 3 * E / 2 + 1.

Несмотря на то что Е — четное, мы не может гарантировать что E / 2 — тоже четное.
Тут возможны обе ситуации.

Но имеет следующее.
Изначально мы имели нечетное число O, которое было равно O = 2 * E + 1.
после одного шага HOTPO, и двух шагов деления на 2, имеем O*** = 3 * E / 2 + 1.

Очевидно, что O*** < O.

(O*** всегда меньше O, для значений E > 1).

Получается что в любом случае, значение исходного числа N уменьшается, то есть стремиться к 1.
Через конечное число шагов мы получаем значение 1.

Где мои 1000 фунтов стерлингов???
Третий Рим должен пасть!
Re[6]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 13:36
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, GhostCoders, Вы писали:


C>>>Вот только это число растёт просто НЕВООБРАЗИМО быстро. Для машины Тьюринга с лентой из 6 элементов _нижняя_ граница составляет 10^1439 шагов (другой автор цитирует 4096 ^^ 166).

GC>>Это зависит от числа возможных состояний головки машины Тьюринга. Чем оно больше тем больше шагов.
C>Для любого реального компьютера это число будет таким, что я даже не знаю как его записать.

C>>>Причём не существует общих способов анализа проблемы останова для алгоритма, работающих за меньшее число шагов, чем сам алгоритм. Т.е. тебе для анализа вполне вероятно может потребоваться выполнить эти 10^1439 шагов.

GC>>А за большее число шагов или за равное — существуют такие алгоритмы.
C>Тогда проще запустить сам алгоритм.

C>>>Так что любой общий алгоритм анализа — это изобретение вечного двигателя.

GC>>Тут я с вами не соглачен. Обший алгоритм анализа существует. Почему? Ответите аргументорованно?
C>Приведите пример решения двух простых задач: http://rsdn.ru/forum/message/3308701.1.aspx
Автор: Cyberax
Дата: 01.03.09


Решение есть, только будет очень долгим. АНАЛИЗАТОР существует.
Третий Рим должен пасть!
Re[5]: Реализован простейший язык для тестирования на зацик
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 14:06
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, D. Mon, Вы писали:


DM>>Здравствуйте, GhostCoders, Вы писали:



DM>>Фишка исходной задачи тут:

DM>>http://en.wikipedia.org/wiki/Collatz_conjecture
DM>>http://mathworld.wolfram.com/CollatzProblem.html
DM>>если решишь для случая целых чисел (в математическом смысле), 1000 фунтов стерлингов получишь сразу, другие премии позже.

GC>Доказывается элементарно.


GC>Скажем если число N — четно, то оно уменьшается в два раза. То есть стремиться к единице. Тут все оцевидно.



GC>Если число нечетно, то нечетно число O можно представить через четное число E следующим образом:


GC> O = 2 * E + 1.


Возьмём число 7 = 2 * 3 + 1

GC>(Скажем 17 можно представить как 2 * 8 + 1), где O = 17, E = 8.


GC>Для нечетных чисел производиться операция N = 3 * N + 1, то есть имеем следующее


GC> O* = 3 * (2 * E + 1) + 1 = 6 * E + 3 + 1 = 6 * E + 4;


GC>то есть на следующей итерации имеем число O* = 6 * E + 4;

GC>Но оно всегда будет четным, так как если четно Е, то умножение четного числа на любое другое число
GC>дает четное число, придавление 4 картины не изменеят, так как 4 — четное.

GC>Следовательно, следующий шаг деление на 2.


GC>Имеем O** = 3 * E + 2.


O** = 3 * 3 + 2 = 11

GC>Число O** — тоже четное по тем же причинам.


11 — чётное?
(ну и хотелось бы услышать, что за "те же причины")
Re[3]: в КУ было...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.03.09 14:07
Оценка: 8 (1) +1
Здравствуйте, Alexey F, Вы писали:

AF>Аааа, после того топика мне в голову пришла мысль о анализаторе, примерно о таком же, о котором пишет GhostCoders Перебор осмысленных вариантов на основе условий выполнения и условий циклов внутри тестируемой функции Только мысль была отметена за минуту


Рекомендую посмотреть, как работает Pex (сделанный в Microsoft Research). Была презентация на PDC.
Re[7]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 01.03.09 14:07
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>>>Тут я с вами не соглачен. Обший алгоритм анализа существует. Почему? Ответите аргументорованно?

C>>Приведите пример решения двух простых задач: http://rsdn.ru/forum/message/3308701.1.aspx
Автор: Cyberax
Дата: 01.03.09

GC>Решение есть, только будет очень долгим. АНАЛИЗАТОР существует.
Ну так какое решение-то? Перебрать все варианты циклов? Тогда это совершенно несерьёзно.

Нормальные статические валидаторы кода работают за счёт того, что строят логическую модель программы и пытаются в ней доказывать теоремы (о том, что имеем выход индекса за границу, обращение по невалидному указателю и т.п.). Если такая теорема доказывается — это означает ошибку.

См. сюда: http://en.wikipedia.org/wiki/Satisfiability_Modulo_Theories и http://verify.stanford.edu/SVC/

Эти методы реально работают и полезны, но они решают только весьма узкий диапазон задач, и без специальных эвристик и спец. обработки частных случаев на практике бесполезны.
Sapienti sat!
Re[5]: Реализован простейший язык для тестирования на зацик
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.03.09 14:10
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Скажем если число N — четно, то оно уменьшается в два раза. То есть стремиться к единице. Тут все оцевидно.


Ошибка здесь. Это верно для степеней двойки, но не для всех четных чисел.
Re[8]: Реализован простейший язык для тестирования на зацик
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 14:12
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, GhostCoders, Вы писали:


GC>>>>Тут я с вами не соглачен. Обший алгоритм анализа существует. Почему? Ответите аргументорованно?

C>>>Приведите пример решения двух простых задач: http://rsdn.ru/forum/message/3308701.1.aspx
Автор: Cyberax
Дата: 01.03.09

GC>>Решение есть, только будет очень долгим. АНАЛИЗАТОР существует.
C>Ну так какое решение-то? Перебрать все варианты циклов? Тогда это совершенно несерьёзно.

C>Нормальные статические валидаторы кода работают за счёт того, что строят логическую модель программы и пытаются в ней доказывать теоремы (о том, что имеем выход индекса за границу, обращение по невалидному указателю и т.п.). Если такая теорема доказывается — это означает ошибку.


C>См. сюда: http://en.wikipedia.org/wiki/Satisfiability_Modulo_Theories и http://verify.stanford.edu/SVC/


C>Эти методы реально работают и полезны, но они решают только весьма узкий диапазон задач, и без специальных эвристик и спец. обработки частных случаев на практике бесполезны.


Ещё по идее есть "обратный" подход — Total functional programming, в нём целеноправленно сделаны ограничения, чтобы получать явно завершающуюся программу. Правда, пока это до реальных реализации не дошло вроде как.
Re[9]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 01.03.09 14:15
Оценка:
Здравствуйте, Курилка, Вы писали:

C>>Эти методы реально работают и полезны, но они решают только весьма узкий диапазон задач, и без специальных эвристик и спец. обработки частных случаев на практике бесполезны.

К>Ещё по идее есть "обратный" подход — Total functional programming, в нём целеноправленно сделаны ограничения, чтобы получать явно завершающуюся программу. Правда, пока это до реальных реализации не дошло вроде как.
Уже дошло, даже на практике начинает использоваться — http://augeas.net/
Sapienti sat!
Re[8]: Поиск
От: SergeCpp Россия http://zoozahita.ru
Дата: 01.03.09 14:19
Оценка: 4 (1)
Нужно найти 123124.
На вход поступает 123123124.
Если мы очистим буфер (начнём поиск совпадения сначала) при поступлении второй 3, то пропустим совпадение.
Тут нужен сдвиг.
Это нечто вроде (а может и он самый) алгоритма Боуера-Мура поиска подстроки.
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[10]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 14:24
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Курилка, Вы писали:


C>>>Эти методы реально работают и полезны, но они решают только весьма узкий диапазон задач, и без специальных эвристик и спец. обработки частных случаев на практике бесполезны.

К>>Ещё по идее есть "обратный" подход — Total functional programming, в нём целеноправленно сделаны ограничения, чтобы получать явно завершающуюся программу. Правда, пока это до реальных реализации не дошло вроде как.
C>Уже дошло, даже на практике начинает использоваться — http://augeas.net/

Чтот не вижу при чём тут TFP
Бумеранговские линзы гарантированно тотальны?
Ну и речь всёж идёт от языке общего применения.
Re[9]: Поиск
От: Alexey F  
Дата: 01.03.09 14:26
Оценка:
Здравствуйте, SergeCpp, Вы писали:

SC>Нужно найти 123124.

SC>На вход поступает 123123124.
SC>Если мы очистим буфер (начнём поиск совпадения сначала) при поступлении второй 3, то пропустим совпадение.
SC>Тут нужен сдвиг.
SC>Это нечто вроде (а может и он самый) алгоритма Боуера-Мура поиска подстроки.

Да, я поторопился
Спасибо за уточнение
Re[11]: Реализован простейший язык для тестирования на заци
От: Cyberax Марс  
Дата: 01.03.09 14:34
Оценка:
Здравствуйте, Курилка, Вы писали:

C>>Уже дошло, даже на практике начинает использоваться — http://augeas.net/

К>Чтот не вижу при чём тут TFP
К>Бумеранговские линзы гарантированно тотальны?
Нет, но они используют результаты исследований в области TFP.

К>Ну и речь всёж идёт от языке общего применения.

Это вряд ли.
Sapienti sat!
Re: Реализован простейший язык для тестирования на зациклив
От: Tissot Россия  
Дата: 01.03.09 14:38
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Реализовал транслятор простейшего языка программирования.

GC>Для целей тестирования алгоритма, который определеят зависает ли определенная программа,
GC>и если зависает то на каких наборах данных.

Проверьте вашей программой вашу же программу
Re[11]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 16:42
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Ну и речь всёж идёт от языке общего применения.


Он же будет не Тьюринг полный.
Re[12]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 16:49
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


К>>Ну и речь всёж идёт от языке общего применения.


FR>Он же будет не Тьюринг полный.


В том и смысл, что мощность машины Тьюринга избыточна, по меньшей мере для большинства задач.
Как пример — реальные машины не обладают бесконечной памятью (в отличие от классической МТ с бесконечной лентой)
Re[13]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 17:18
Оценка:
Здравствуйте, Курилка, Вы писали:

К>В том и смысл, что мощность машины Тьюринга избыточна, по меньшей мере для большинства задач.


Есть куча задач где она недостаточна, ждем квантовые вычислители.
Вообще прикольно математики уже сдаются, становятся "физиками" а CS'ники все еще барахтаются

К>Как пример — реальные машины не обладают бесконечной памятью (в отличие от классической МТ с бесконечной лентой)


Ну для большинства задач вполне обладают.
Re[14]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 17:42
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


К>>В том и смысл, что мощность машины Тьюринга избыточна, по меньшей мере для большинства задач.


FR>Есть куча задач где она недостаточна, ждем квантовые вычислители.

Т.е. есть более мощная вычислительная модель чем МТ?
Расскажи.
FR>Вообще прикольно математики уже сдаются, становятся "физиками" а CS'ники все еще барахтаются
Смысла предложения не понял

К>>Как пример — реальные машины не обладают бесконечной памятью (в отличие от классической МТ с бесконечной лентой)


FR>Ну для большинства задач вполне обладают.


Раскрой
Re[15]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 18:22
Оценка:
Здравствуйте, Курилка, Вы писали:

FR>>Есть куча задач где она недостаточна, ждем квантовые вычислители.

К>Т.е. есть более мощная вычислительная модель чем МТ?
К>Расскажи.

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

FR>>Вообще прикольно математики уже сдаются, становятся "физиками" а CS'ники все еще барахтаются

К>Смысла предложения не понял

тут http://elementy.ru/lib/430319

Иными словами, при любом конечном наборе аксиом мы имеем бесконечное число истин, которые не могут быть доказаны с помощью этого набора.


Из неприводимости числа Ω следует, что всеобъемлющей математической теории существовать не может. Бесконечное множество битов Ω составляет бесконечное множество математических фактов (является ли каждый выбранный бит единицей или нулем), которые не могут быть выведены из каких бы то ни было принципов, более простых, чем сама последовательность битов. Значит, сложность математики бесконечна, тогда как любая отдельная теория «всего на свете» характеризуется конечной сложностью и, следовательно, не может охватить все богатство мира математических истин.



К>Раскрой


2^32 это очень не мало
Re[16]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 18:33
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


FR>>>Есть куча задач где она недостаточна, ждем квантовые вычислители.

К>>Т.е. есть более мощная вычислительная модель чем МТ?
К>>Расскажи.

FR>Квантовые вычисления мощнее так как позволяют в общем случае проводить вычисления которые

FR>невозможны в машине Тьюринга, за подробностями гугли Пенроуза.

Ммм, как-то не очень внятно, но допустим.

FR>>>Вообще прикольно математики уже сдаются, становятся "физиками" а CS'ники все еще барахтаются

К>>Смысла предложения не понял

FR>тут http://elementy.ru/lib/430319


FR>

FR>Иными словами, при любом конечном наборе аксиом мы имеем бесконечное число истин, которые не могут быть доказаны с помощью этого набора.


А также бесконечное число истин, которые могу быть доказаны

FR>

FR>Из неприводимости числа Ω следует, что всеобъемлющей математической теории существовать не может. Бесконечное множество битов Ω составляет бесконечное множество математических фактов (является ли каждый выбранный бит единицей или нулем), которые не могут быть выведены из каких бы то ни было принципов, более простых, чем сама последовательность битов. Значит, сложность математики бесконечна, тогда как любая отдельная теория «всего на свете» характеризуется конечной сложностью и, следовательно, не может охватить все богатство мира математических истин.



И в каком месте математики становятся "физиками"?

К>>Раскрой


FR>2^32 это очень не мало


Много и бесконечно — это довольно разные вещи.
Для вычисления "больших" задач бесконечная лента не нужна.
Re[16]: Реализован простейший язык для тестирования на заци
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.03.09 18:38
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>>>Есть куча задач где она недостаточна, ждем квантовые вычислители.

К>>Т.е. есть более мощная вычислительная модель чем МТ?
К>>Расскажи.
FR>Квантовые вычисления мощнее так как позволяют в общем случае проводить вычисления которые
FR>невозможны в машине Тьюринга, за подробностями гугли Пенроуза.

Что-то я у Пенроуза видел только предположения, что может существовать вычислительный квантовый процесс, превосходящий МТ. Типа, что он сможет придумывать новые истинные аксиомы, как это делают люди. Но ничего конкретного.

Разрабатываемые (и мыслимые) сейчас квантовые компьютеры не превосходят МТ.
Re[16]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 18:44
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


FR>>>Есть куча задач где она недостаточна, ждем квантовые вычислители.

К>>Т.е. есть более мощная вычислительная модель чем МТ?
К>>Расскажи.

FR>Квантовые вычисления мощнее так как позволяют в общем случае проводить вычисления которые

FR>невозможны в машине Тьюринга, за подробностями гугли Пенроуза.

вики, конечно, стрёмный источник, но всёж:

Although quantum computers may be faster than classical computers, those described above can't solve any problems that classical computers can't solve, given enough time and memory (albeit possibly an amount that could never practically be brought to bear).


По-моему ты подмешиваешь к просто мощности вычислительной модели (т.е. вопрос принципиальной выразимости выч. задач) ещё её скорость. Конечно, с практической т.зр. вопрос очень важный, но речь вроде не о нём шла.
Плюс я не уверен, что принципы TFP не применимы к квантовым вычислениям (хотя зарекаться не буду, т.к. не очень в них разбираюсь)
Re[17]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 18:49
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Ммм, как-то не очень внятно, но допустим.


Внятнее тут http://ru.wikipedia.org/wiki/Алгоритмическая_неразрешимость

Важно отметить, что множество программ для этого исполнителя (например, множество машин Тьюринга при фиксированном алфавите входных и выходных данных) счётно. Поэтому вычислимых функций не более чем счётно. В то время как множество функций вида несчётно, если N счётно. Значит есть не вычислимые функции, причём их мощность больше, чем мощность вычислимых функций.


К>А также бесконечное число истин, которые могу быть доказаны


Смотри цитату выше, это разные бесконечности
Те которые можно доказать счетны, а недоказуемые (на данном наборе аксиом) нечетны, разница как между конечным и бесконечным.

К>И в каком месте математики становятся "физиками"?


В таком что математика такая же эксперементальная наука как и все остальные, с нее сняли корону

FR>>2^32 это очень не мало


К>Много и бесконечно — это довольно разные вещи.


Угу

К>Для вычисления "больших" задач бесконечная лента не нужна.


От задач зависит
Re[18]: Реализован простейший язык для тестирования на заци
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.03.09 18:54
Оценка:
Здравствуйте, FR, Вы писали:

FR>Смотри цитату выше, это разные бесконечности

FR>Те которые можно доказать счетны, а недоказуемые (на данном наборе аксиом) нечетны, разница как между конечным и бесконечным.

Не совсем так. Оба этих множества счетны, так как являются подмножествами счетного множества well-formed формул. Только множество доказуемых истин recursively enumerable, а недоказуемых — нет.
Re[17]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 19:04
Оценка:
Здравствуйте, nikov, Вы писали:


N>Что-то я у Пенроуза видел только предположения, что может существовать вычислительный квантовый процесс, превосходящий МТ. Типа, что он сможет придумывать новые истинные аксиомы, как это делают люди. Но ничего конкретного.


Угу.

N>Разрабатываемые (и мыслимые) сейчас квантовые компьютеры не превосходят МТ.


А вот это не доказано, есть только тезис Тьюринга, который не больше чем гипотеза.
Re[17]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 19:09
Оценка:
Здравствуйте, Курилка, Вы писали:

К>По-моему ты подмешиваешь к просто мощности вычислительной модели (т.е. вопрос принципиальной выразимости выч. задач) ещё её скорость. Конечно, с практической т.зр. вопрос очень важный, но речь вроде не о нём шла.

К>Плюс я не уверен, что принципы TFP не применимы к квантовым вычислениям (хотя зарекаться не буду, т.к. не очень в них разбираюсь)

Насколько я понимаю никто пока ни доказал что квантовые вычисления эквивалентны машине Тьюринга, обратное тоже не доказано.

А с практической точки зрения никакие квантовые вычислители не нужны, достаточно аппаратной реализации недетерминированной машины Тьюринга http://ru.wikipedia.org/wiki/Недетерминированная_машина_Тьюринга (котороая теоретически равномощна обычной машине)
Re[6]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 19:12
Оценка:
Здравствуйте, Курилка, Вы писали:

GC>>Имеем O** = 3 * E + 2.


К>O** = 3 * 3 + 2 = 11


GC>>Число O** — тоже четное по тем же причинам.


К>11 — чётное?

К>(ну и хотелось бы услышать, что за "те же причины")

Да, здесь ошибка, признаю.

O = 2 * E + 1

где O — нечетное число,
четным здесь является 2 * E — по определению,
а вот само E может быть как четным, так и нет

O* я вычислил правильно, но вот O** — неправильно.

Не получилось доказать. Бывает.
Третий Рим должен пасть!
Re[19]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 19:14
Оценка:
Здравствуйте, nikov, Вы писали:

N>Не совсем так. Оба этих множества счетны, так как являются подмножествами счетного множества well-formed формул. Только множество доказуемых истин recursively enumerable, а недоказуемых — нет.


А разве общее множество всех формул не несчетно?
Re[2]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 19:22
Оценка:
Здравствуйте, Tissot, Вы писали:

T>Здравствуйте, GhostCoders, Вы писали:


GC>>Реализовал транслятор простейшего языка программирования.

GC>>Для целей тестирования алгоритма, который определеят зависает ли определенная программа,
GC>>и если зависает то на каких наборах данных.

T>Проверьте вашей программой вашу же программу


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

D* = C + D

D** = C + D**

то есть вывод такой сама себя она не может анализировать.
Третий Рим должен пасть!
Re[20]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 19:22
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, nikov, Вы писали:


N>>Не совсем так. Оба этих множества счетны, так как являются подмножествами счетного множества well-formed формул. Только множество доказуемых истин recursively enumerable, а недоказуемых — нет.


FR>А разве общее множество всех формул не несчетно?


Ну по идее есть же Гёделева нумерация (базис доказательства теоремы Гёделя), так что вполне себе счётно.
Re[7]: Реализован простейший язык для тестирования на зацик
От: . Великобритания  
Дата: 01.03.09 19:36
Оценка: :)
GhostCoders wrote:

> Не получилось доказать. Бывает.

А зачем ты сам пытаешься доказать? У тебя же есть этот простейший язык. Или внутре его неонка?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Реализован простейший язык для тестирования на зацик
От: GhostCoders Россия  
Дата: 01.03.09 19:43
Оценка:
Здравствуйте, ., Вы писали:

.>GhostCoders wrote:


>> Не получилось доказать. Бывает.

.>А зачем ты сам пытаешься доказать? У тебя же есть этот простейший язык. Или внутре его неонка?

Я хочу вам показать одну вещь.
Есть БОЛЬШАЯ разница между абстрактным алгоритмом вообще и его реализаией на реальной вычислительной машине.

Абстрактные алгоритмы используют понятие числа, переменной и т.д.
Но никто эти числа не ограничивает никак. В вычислителных машинах мы используем ограниченные области памяти для
хранения чисел — байты, слова, 32 битные значения, сейчас уже на 64 бит перешли.
Вот в этом и главная разница. Абстрактный алгоритм может уйти в бесконечность,
наш же реальный переполнится в какой-либо переменной, после максимального значения, переменная установиться в значение 0.

С помощью простейшего языка я методом перебора могу тебе дать гарантию что он не зависнит, например, на 10000 входных значений.
Третий Рим должен пасть!
Re[21]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 01.03.09 19:45
Оценка:
Здравствуйте, Курилка, Вы писали:

FR>>А разве общее множество всех формул не несчетно?


К>Ну по идее есть же Гёделева нумерация (базис доказательства теоремы Гёделя), так что вполне себе счётно.


Склероз мне подсказывает теорему Кантора
И этот же склероз подсказывает что Геделева нумерация как раз и выделяет счетное подмножество вычислимых формул из общего несчетного множества формул вообще (под формулой имеется в виду отображение счетного множества на четное же множество)
Re: Текст программы обнаружения зависаний опубликован
От: GhostCoders Россия  
Дата: 01.03.09 20:07
Оценка:
Выкладываю реализацию транслятора простейшего языка на С++
вместе с анализатором.

Код написал за 3-4 часа, качество, признаюсь УЖАСНОЕ, не до того было.
Он позволяет понять суть моего метода.

Это консольное приложение на С++. Аргументы командной строки следующие:
SimpleLanguageCompiler.exe имя_файла_на_простейшем_языке команда_что_делать

где
имя_файла_на_простейшем_языке — файл должен существовать и содержать в себе валидный текст на языке SL
команда_что_делать ключевое слово из следующих:
COMPILEONLY — транслирует входной текст на язык С++ (на выходе имеем файл с расширением .cpp),
который реализует данный алгоритм на SL
Этот файл можно откомпилировать компилятором MSVC (и думаю GCC тоже),
получить исполняемый .exe файл, который попросит у вас ввести все
значения для исходных переменных, начнет вычисление, и если алгортм не зависает,
в конце вычислений выдаст на экран значения результатов
(OUTPUT-переменные объявленные в заголовке программы)
Замечание. Компилировать этот .cpp файл можно из командной строки,
предварительно набрав: "%VS80COMNTOOLS%\vsvars32.bat"
что даст доступным компилятор cl.exe из командной строки,
потом вводим cl имя_файла.cpp
он компилируется, запускаем программу имя_файла.exe
и наслаждаемся результатом.

В этом режиме никаких проверок и анализов не производиться.

COMPILEWITHVALIDATE — подобно COMPILEONLY, только вставляется код для защиты от зависаний.
Если обнаружено зависание, на экран выведется соответствующее сообщение, и программа
терминирует.

TEST — получается файл, который тестирует программу на всех наборах значений. Выдает все значения
при которых программа зависает на экран. В конце выдает небольшую "статистику".


Хочется сказать, что многие программисты, изучая в институте машину Тьюринга,
конечно слышили о проблеме неразрешимости, так же как и о "вечном двигателе" и попытках создать его.
Но есть одно НО, машина Тьюринга бесконечна, для конечных машин, проблема зависания все же
РАЗРЕШИМА, хотя бы в теории. Про это обычно забывают, и в английской вики про это пишут,
что это распространенное заблуждение, что неразрешимость проблемы машины Тьюринга переносят
на конечные компьютеры. http://en.wikipedia.org/wiki/Halting_problem — сомтрите "Common pitfalls".

The halting problem is, in theory if not in practice, decidable for linear bounded automata (LBAs), or deterministic machines with finite memory. A machine with finite memory has a finite number of states, and thus any deterministic program on it must eventually either halt or repeat a previous state:

"...any finite-state machine, if left completely to itself, will fall eventually into a perfectly periodic repetitive pattern. The duration of this repeating pattern cannot exceed the number of internal states of the machine..."(italics in original, Minsky 1967, p. 24)


Смысл в следующем. Что цикл зависания не может превосходить число внутренних состояний такой машины.

Ну а вот исходный текст АНАЛИЗАТОРА:

/*
* Copyright (c) 2009 by
* IP PETROV PETR PETROVICH.
* All Rights Reserved
*
* This software comprises unpublished confidential information
* including intellectual property of IP PETROV PETR PETROVICH.
* and may not be used, copied or made available to anyone, except in
* accordance with the licence under which it is furnished.
*
*/

#include "stdafx.h"

#define INT8 0
#define UINT8 1

int typec = 0; // 0 -compile. 1- validate, 2 — test

struct subprogram
{
std::string name;
std::vector<std::string> inputNames;
std::set<std::string> sinputNames;
std::vector<int> inputTypes;
std::vector<std::string> outputNames;
std::set<std::string> soutputNames;
std::vector<int> outputTypes;
std::vector<std::string> varNames;
std::set<std::string> svarNames;
std::vector<int> varTypes;
};

std::vector<subprogram> subprograms;
std::vector<subprogram> programs;
std::set<std::string> subprogram_names;
std::set<std::string> program_names;
std::string curContext;

int counter = 0;

void _fillstate(FILE* f,FILE* o)
{
counter++;

subprogram * sp = 0;

for(size_t i=0;i<subprograms.size();i++)
{
if (subprograms[i].name == curContext)
{
sp = &(subprograms[i]);
break;
}
}
for(size_t i=0;i<programs.size();i++)
{
if (programs[i].name == curContext)
{
sp = &(programs[i]);
break;
}
}
fprintf(o,"\t_curstate.line = %d;\n",counter++);

fprintf(o,"\t_curstate.variables.clear();\n",counter++);
for(size_t i=0;i<sp->inputNames.size();i++)
{
fprintf(o,"\t_curstate.variables.push_back(%s);\n",sp->inputNames[i].c_str());
}
for(size_t i=0;i<sp->outputNames.size();i++)
{
fprintf(o,"\t_curstate.variables.push_back(%s);\n",sp->outputNames[i].c_str());
}
for(size_t i=0;i<sp->varNames.size();i++)
{
fprintf(o,"\t_curstate.variables.push_back(%s);\n",sp->varNames[i].c_str());
}
}

void __check(FILE* f,FILE* o)
{
if (0 != typec)
{
_fillstate(f,o);
fprintf(o,"\t__check(&_curstate);\n");
}
}

int _subprogram(FILE* f,FILE* o,bool is_subprogram = true)
{
subprogram newSubprogram;
char name[5000] = { 0 };
fscanf(f,"%s",name);
if (subprogram_names.find(std::string(name)) != subprogram_names.end())
{
printf("error: subprogram %s is always defined\n",name);
return 0;
}
if (program_names.find(std::string(name)) != program_names.end())
{
printf("error: subprogram %s is always defined\n",name);
return 0;
}
curContext = std::string(name);
newSubprogram.name = std::string(name);
char next[5000] = { 0 };
fscanf(f,"%s",next);
while(strcmp(next,"BEGIN"))
{
if (!strcmp(next,"INPUT"))
{
char iname[5000] = { 0 };
fscanf(f,"%s",iname);
if (newSubprogram.sinputNames.find(std::string(iname)) != newSubprogram.sinputNames.end())
{
printf("error: input argument's name %s is always used\n",iname);
return 0;
}
if (newSubprogram.soutputNames.find(std::string(iname)) != newSubprogram.soutputNames.end())
{
printf("error: input argument's name %s is always used\n",iname);
return 0;
}
if (newSubprogram.svarNames.find(std::string(iname)) != newSubprogram.svarNames.end())
{
printf("error: input argument's name %s is always used\n",iname);
return 0;
}
newSubprogram.sinputNames.insert(std::string(iname));
newSubprogram.inputNames.push_back(std::string(iname));
char typeKeyword[5000] = { 0 };
fscanf(f,"%s",typeKeyword);
if (strcmp(typeKeyword,"TYPE"))
{
printf("error: TYPE keyword is absent\n");
return 0;
}
char _typename[5000] = { 0 };
fscanf(f,"%s",_typename);
if (!strcmp(_typename,"int8"))
{
newSubprogram.inputTypes.push_back(INT8);
}else
if (!strcmp(_typename,"uint8"))
{
newSubprogram.inputTypes.push_back(UINT8);
}else
{
printf("error: unknown type %s\n",_typename);
return 0;
}
}else
if (!strcmp(next,"OUTPUT"))
{
char oname[5000] = { 0 };
fscanf(f,"%s",oname);
if (newSubprogram.sinputNames.find(std::string(oname)) != newSubprogram.sinputNames.end())
{
printf("error: output argument's name %s is always used\n",oname);
return 0;
}
if (newSubprogram.soutputNames.find(std::string(oname)) != newSubprogram.soutputNames.end())
{
printf("error: output argument's name %s is always used\n",oname);
return 0;
}
if (newSubprogram.svarNames.find(std::string(oname)) != newSubprogram.svarNames.end())
{
printf("error: output argument's name %s is always used\n",oname);
return 0;
}
newSubprogram.soutputNames.insert(std::string(oname));
newSubprogram.outputNames.push_back(std::string(oname));
char typeKeyword[5000] = { 0 };
fscanf(f,"%s",typeKeyword);
if (strcmp(typeKeyword,"TYPE"))
{
printf("error: TYPE keyword is absent\n");
return 0;
}
char _typename[5000] = { 0 };
fscanf(f,"%s",_typename);
if (!strcmp(_typename,"int8"))
{
newSubprogram.outputTypes.push_back(INT8);
}else
if (!strcmp(_typename,"uint8"))
{
newSubprogram.outputTypes.push_back(UINT8);
}else
{
printf("error: unknown type %s\n",_typename);
return 0;
}
}else
if (!strcmp(next,"VAR"))
{
char vname[5000] = { 0 };
fscanf(f,"%s",vname);
if (newSubprogram.sinputNames.find(std::string(vname)) != newSubprogram.sinputNames.end())
{
printf("error: variable's name %s is always used\n",vname);
return 0;
}
if (newSubprogram.soutputNames.find(std::string(vname)) != newSubprogram.soutputNames.end())
{
printf("error: variable's name %s is always used\n",vname);
return 0;
}
if (newSubprogram.svarNames.find(std::string(vname)) != newSubprogram.svarNames.end())
{
printf("error: variable's name %s is always used\n",vname);
return 0;
}
newSubprogram.svarNames.insert(std::string(vname));
newSubprogram.varNames.push_back(std::string(vname));
char typeKeyword[5000] = { 0 };
fscanf(f,"%s",typeKeyword);
if (strcmp(typeKeyword,"TYPE"))
{
printf("error: TYPE keyword is absent\n");
return 0;
}
char _typename[5000] = { 0 };
fscanf(f,"%s",_typename);
if (!strcmp(_typename,"int8"))
{
newSubprogram.varTypes.push_back(INT8);
}else
if (!strcmp(_typename,"uint8"))
{
newSubprogram.varTypes.push_back(UINT8);
}else
{
printf("error: unknown type %s\n",_typename);
return 0;
}
}else
if (strcmp(next,"BEGIN"))
{
printf("error: waiting for BEGIN token\n");
return 0;
}
fscanf(f,"%s",next);
}

if (is_subprogram)
{
subprograms.push_back(newSubprogram);
subprogram_names.insert(std::string(name));
}else
{
programs.push_back(newSubprogram);
program_names.insert(std::string(name));
}

fprintf(o,"void %s (",name);
for(size_t i=0;i<newSubprogram.inputNames.size();i++)
{
if (newSubprogram.inputTypes[i] == INT8)
{
fprintf(o,"char ");
}else
if (newSubprogram.inputTypes[i] == UINT8)
{
fprintf(o,"unsigned char ");
}
fprintf(o,"&%s",newSubprogram.inputNames[i].c_str());
fprintf(o,", ");
}
for(size_t i=0;i<newSubprogram.outputNames.size();i++)
{
if (newSubprogram.outputTypes[i] == INT8)
{
fprintf(o,"char ");
}else
if (newSubprogram.outputTypes[i] == UINT8)
{
fprintf(o,"unsigned char ");
}
fprintf(o,"&%s",newSubprogram.outputNames[i].c_str());
fprintf(o,", ");
}

fprintf(o,"void* __dummy)\n");
fprintf(o,"{\n");

for(size_t i=0;i<newSubprogram.varNames.size();i++)
{
if (newSubprogram.varTypes[i] == INT8)
{
fprintf(o,"\tstatic char ");
}else
if (newSubprogram.varTypes[i] == UINT8)
{
fprintf(o,"\tstatic unsigned char ");
}
fprintf(o,"%s = 0;\n",newSubprogram.varNames[i].c_str());
}
for(size_t i=0;i<newSubprogram.outputNames.size();i++)
{
fprintf(o,"\t%s = 0;\n",newSubprogram.outputNames[i].c_str());
}
return 0;
}

void _inco(FILE* f,FILE *o)
{
__check(f,o);

char vname[5000] = { 0 };
fscanf(f,"%s",vname);

fprintf(o,"\t%s++;\n",vname);

}

void _deco(FILE* f,FILE *o)
{
__check(f,o);

char vname[5000] = { 0 };
fscanf(f,"%s",vname);

fprintf(o,"\t%s--;\n",vname);
}

void _mulo(FILE *f,FILE* o)
{
__check(f,o);

char vname1[5000] = { 0 };
fscanf(f,"%s",vname1);
char vname2[5000] = { 0 };
fscanf(f,"%s",vname2);
char vname3[5000] = { 0 };
fscanf(f,"%s",vname3);

fprintf(o,"\t%s = %s * %s;\n",vname1,vname2,vname3);
}

void _set(FILE *f,FILE* o)
{
__check(f,o);

char vname1[5000] = { 0 };
fscanf(f,"%s",vname1);
char vname2[5000] = { 0 };
fscanf(f,"%s",vname2);
fprintf(o,"\t%s = %s;\n",vname1,vname2);
}

void _let(FILE *f,FILE* o)
{
__check(f,o);

char vname1[5000] = { 0 };
fscanf(f,"%s",vname1);
char vname2[5000] = { 0 };
fscanf(f,"%s",vname2);
fprintf(o,"\t%s = %s;\n",vname1,vname2);
}


void _divo(FILE *f,FILE* o)
{
__check(f,o);

char vname1[5000] = { 0 };
fscanf(f,"%s",vname1);
char vname2[5000] = { 0 };
fscanf(f,"%s",vname2);
char vname3[5000] = { 0 };
fscanf(f,"%s",vname3);

fprintf(o,"\t%s = %s / %s;\n",vname1,vname2,vname3);
}

void _modo(FILE *f,FILE* o)
{
__check(f,o);

char vname1[5000] = { 0 };
fscanf(f,"%s",vname1);
char vname2[5000] = { 0 };
fscanf(f,"%s",vname2);
char vname3[5000] = { 0 };
fscanf(f,"%s",vname3);

fprintf(o,"\t%s = %s %% %s;\n",vname1,vname2,vname3);
}

void _addo(FILE *f,FILE* o)
{
__check(f,o);

char vname1[5000] = { 0 };
fscanf(f,"%s",vname1);
char vname2[5000] = { 0 };
fscanf(f,"%s",vname2);
char vname3[5000] = { 0 };
fscanf(f,"%s",vname3);

fprintf(o,"\t%s = %s + %s;\n",vname1,vname2,vname3);
}

void _subo(FILE *f,FILE* o)
{
__check(f,o);

char vname1[5000] = { 0 };
fscanf(f,"%s",vname1);
char vname2[5000] = { 0 };
fscanf(f,"%s",vname2);
char vname3[5000] = { 0 };
fscanf(f,"%s",vname3);

fprintf(o,"\t%s = %s — %s;\n",vname1,vname2,vname3);
}

void _label(FILE *f,FILE* o)
{
__check(f,o);

char name[5000] = { 0 };
fscanf(f,"%s",name);

fprintf(o,"label_%s_%s:\n",curContext.c_str(),name);
}

void _goto(FILE *f,FILE* o)
{
__check(f,o);

char name[5000] = { 0 };
fscanf(f,"%s",name);

fprintf(o,"\tgoto label_%s_%s;\n",curContext.c_str(),name);
}

void _ifequal(FILE *f,FILE* o)
{
__check(f,o);

char a1[5000] = { 0 };
fscanf(f,"%s",a1);
char a2[5000] = { 0 };
fscanf(f,"%s",a2);

fprintf(o,"\tif( %s == %s ) {\n\t",a1,a2);

char gotoK[5000] = { 0 };
fscanf(f,"%s",gotoK);
if (strcmp(gotoK,"GOTO"))
{
printf("error: waiting for GOTO keyword\n");
}

_goto(f,o);
fprintf(o,"\t}\n");

char e[5000] = { 0 };
fscanf(f,"%s",e);
if (!strcmp(e,"ELSE"))
{
fprintf(o,"\telse { \n\t");
_goto(f,o);
fprintf(o,"\t}\n");
}else
{
}
}

void _ifgreat(FILE *f,FILE* o)
{
__check(f,o);

char a1[5000] = { 0 };
fscanf(f,"%s",a1);
char a2[5000] = { 0 };
fscanf(f,"%s",a2);

fprintf(o,"\tif( %s > %s ) {\n\t",a1,a2);

char gotoK[5000] = { 0 };
fscanf(f,"%s",gotoK);
if (strcmp(gotoK,"GOTO"))
{
printf("error: waiting for GOTO keyword\n");
}

_goto(f,o);
fprintf(o,"\t}\n");

char e[5000] = { 0 };
fscanf(f,"%s",e);
if (!strcmp(e,"ELSE"))
{
fprintf(o,"\telse { \n\t");
_goto(f,o);
fprintf(o,"\t}\n");
}else
{
}
}

void _ifless(FILE *f,FILE* o)
{
__check(f,o);

char a1[5000] = { 0 };
fscanf(f,"%s",a1);
char a2[5000] = { 0 };
fscanf(f,"%s",a2);

fprintf(o,"\tif( %s < %s ) {\n\t",a1,a2);

char gotoK[5000] = { 0 };
fscanf(f,"%s",gotoK);
if (strcmp(gotoK,"GOTO"))
{
printf("error: waiting for GOTO keyword\n");
}

_goto(f,o);
fprintf(o,"\t}\n");

char e[5000] = { 0 };
fscanf(f,"%s",e);
if (!strcmp(e,"ELSE"))
{
fprintf(o,"\telse { \n\t");
_goto(f,o);
fprintf(o,"\t}\n");
}else
{
}
}

void _call(FILE *f,FILE* o)
{
__check(f,o);

char fname[5000] = { 0 };
fscanf(f,"%s",fname);

if (subprogram_names.find(std::string(fname)) != subprogram_names.end() )
{
for(size_t i=0;i<subprograms.size();i++)
{
if (subprograms[i].name == std::string(fname))
{
int ac = subprograms[i].inputNames.size() + subprograms[i].outputNames.size();
fprintf(o,"\t%s ( ",fname);
for(int k=0;k<ac;k++)
{
char an[5000] = { 0 };
fscanf(f,"%s",an);
fprintf(o,"%s,",an);
}
fprintf(o,"0);\n");

break;
}
}
}else
{
printf("error: subprogram is not founded %s\n",fname);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
printf("Simple Language Translator 1.0\n");
printf("Copyright (c) 2009 by\n");
printf("IP PETR PETROV PETROVICH.\n");
printf("All Rights Reserved.\n\n");

if (argc < 3)
{
printf("Usage: inputfilename.sl ACTION\n");
printf("\there ACTION can be the following:\n");
printf("\tCOMPILEONLY: A Simple Language Program will be compiled to C++ only\n");
printf("\tCOMPILEWITHVALIDATE: A Simple Language Program will be compiled to C++ with Halt-detection code\n");
printf("\tTEST: A simple Language Program will be tested (analised)\n");
return 0;
}

if (!strcmp(argv[2],"COMPILEONLY"))
{
typec = 0;
}else
if (!strcmp(argv[2],"COMPILEWITHVALIDATE"))
{
typec = 1;
}else
if (!strcmp(argv[2],"TEST"))
{
typec = 2;
}else
{
printf("error: incorrect mode\n");
return 0;
}


FILE *f = fopen(argv[1],"rt");
if (0 == f)
{
printf("Could not open input file.\n");
return 0;
}

std::string outfilename = std::string(argv[1]) + std::string(".cpp");
FILE *o = fopen(outfilename.c_str(),"wt");

if (0 == o)
{
printf("Could not create output file.\n");
return 0;
}

fprintf(o,"// This file was generated by Simple Language Translator 1.0\n");
fprintf(o,"// DO NOT EDIT THIS FILE\n\n");

fprintf(o,"#include <stdio.h>\n\n");

//!!!!
if (0 != typec)
{
fprintf(o,"#include <vector>\n\n");
fprintf(o,"struct _state{\n");
fprintf(o,"\tstd::vector<int> variables;\n");
fprintf(o,"\tint line;\n");
fprintf(o,"};\n\n");

fprintf(o,"std::vector<_state> _states;\n\n");

fprintf(o,"bool __compare(_state* s1,_state* s2)\n");
fprintf(o,"{\n");
fprintf(o,"\tif (s1->variables.size() != s2->variables.size()) return false;\n");
fprintf(o,"\tif (s1->line != s2->line) return false;\n");
fprintf(o,"\tfor(size_t i=0;i<s1->variables.size();i++)\n");
fprintf(o,"\t{\n");
fprintf(o,"\t\tif (s1->variables[i] != s2->variables[i]) return false;\n");
fprintf(o,"\t}\n");
fprintf(o,"\treturn true;\n");
fprintf(o,"}\n");

fprintf(o,"void __check(_state* s)\n");
fprintf(o,"{\n");
fprintf(o,"\tfor(size_t i=0;i<_states.size();i++)\n");
fprintf(o,"\t{\n");
fprintf(o,"\t\tif (__compare(s,&_states[i])) {\n");
if (1 == typec)
{
fprintf(o,"\t\t\tprintf(\"program has halted!\\n\");\n");
fprintf(o,"\t\t\texit(1);\n");
}else
if (2 == typec)
{
fprintf(o,"\t\t\tthrow int(1);\n");
}
fprintf(o,"\t\t}\n");
fprintf(o,"\t}\n");
fprintf(o,"\t_states.push_back(*s);\n");
fprintf(o,"}\n\n");
fprintf(o,"_state _curstate;\n");
}

bool comment = false;
bool wasprogram = false;
while(!feof(f))
{
char buff[5000] = { 0 };
fscanf(f,"%s",buff);

if (!strcmp(buff,"*"))
{
comment = !comment;
}else
{
if (!comment)
{
if (!strcmp(buff,"SUBPROGRAM"))
{
_subprogram(f,o,true);
}else
if (!strcmp(buff,"PROGRAM"))
{
if (!wasprogram)
{
_subprogram(f,o,false);
wasprogram = true;
}else
{
printf("error: a program must be one in file\n");
return 0;
}
}else
if (!strcmp(buff,"INC"))
{
_inco(f,o);
}else
if (!strcmp(buff,"DEC"))
{
_deco(f,o);
}else
if (!strcmp(buff,"MUL"))
{
_mulo(f,o);
}else
if (!strcmp(buff,"DIV"))
{
_divo(f,o);
}else
if (!strcmp(buff,"MOD"))
{
_modo(f,o);
}else
if (!strcmp(buff,"ADD"))
{
_addo(f,o);
}else
if (!strcmp(buff,"SUB"))
{
_subo(f,o);
}else
if (!strcmp(buff,"LABEL"))
{
_label(f,o);
}else
if (!strcmp(buff,"GOTO"))
{
_goto(f,o);
}else
if (!strcmp(buff,"IFEQUAL"))
{
_ifequal(f,o);
}else
if (!strcmp(buff,"IFGREAT"))
{
_ifgreat(f,o);
}else
if (!strcmp(buff,"IFLESS"))
{
_ifless(f,o);
}else
if (!strcmp(buff,"CALL"))
{
_call(f,o);
}else
if (!strcmp(buff,"SET"))
{
_set(f,o);
}else
if (!strcmp(buff,"LET"))
{
_let(f,o);
}else
if (!strcmp(buff,"END"))
{
fprintf(o,"\t;\n}\n");
}
}
}

//fprintf(o,"//%s\n",buff);
}

fprintf(o,"int main(int argc,char **argv)\n");
fprintf(o,"{\n");

if (0 == programs.size())
{
printf("error: no program\n");
return 0;
}

if (2 != typec)
{
fprintf(o,"\tint __temporary_var = 0;\n");
}

for(size_t i=0;i<programs[0].inputNames.size();i++)
{
if (programs[0].inputTypes[i] == INT8)
{
fprintf(o,"\tstatic char ");
}else
if (programs[0].inputTypes[i] == UINT8)
{
fprintf(o,"\tstatic unsigned char ");
}
if (2 == typec)
{
fprintf(o,"%s = 0, %s_copy = 0;\n",programs[0].inputNames[i].c_str(),programs[0].inputNames[i].c_str());
}else
{
fprintf(o,"%s = 0;\n",programs[0].inputNames[i].c_str());
}
if (2 != typec)
{
fprintf(o,"\tprintf(\"enter input variable %s:\\n\");\n",programs[0].inputNames[i].c_str());
fprintf(o,"\tscanf(\"%%d\",&__temporary_var);\n");

if (programs[0].inputTypes[i] == INT8)
{
fprintf(o,"\t%s = (char)__temporary_var;\n",programs[0].inputNames[i].c_str());
}else
if (programs[0].inputTypes[i] == UINT8)
{
fprintf(o,"\t%s = (unsigned char)__temporary_var;\n",programs[0].inputNames[i].c_str());
}
}

}

int c1 = 0;
if (2 == typec)
{
fprintf(o,"\tint __total = 0;\n");
fprintf(o,"\tint __total_halt = 0;\n");
for(size_t i=0;i<programs[0].inputNames.size();i++)
{
if (programs[0].inputTypes[i] == INT8)
{
c1++;
fprintf(o,"\tfor(int i%d=0;i%d<=255;i%d++)\n",c1,c1,c1);
fprintf(o,"\t{\n");
fprintf(o,"\t%s = (char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
fprintf(o,"\t%s_copy = (char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
}else
if (programs[0].inputTypes[i] == UINT8)
{
c1++;
fprintf(o,"\tfor(int i%d=-128;i%d<=127;i%d++)\n",c1,c1,c1);
fprintf(o,"\t{\n");
fprintf(o,"\t%s = (unsigned char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
fprintf(o,"\t%s_copy = (unsigned char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
}
}
}

for(size_t i=0;i<programs[0].outputNames.size();i++)
{
if (programs[0].outputTypes[i] == INT8)
{
fprintf(o,"\tstatic char ");
}else
if (programs[0].outputTypes[i] == UINT8)
{
fprintf(o,"\tstatic unsigned char ");
}
fprintf(o,"%s = 0;\n",programs[0].outputNames[i].c_str());
}

if (2 == typec)
{
fprintf(o,"\ttry { \n");
fprintf(o,"\t__total++;\n");
fprintf(o,"\t_states.clear();\n");
}

fprintf(o,"\t%s (",programs[0].name.c_str());
for(size_t i=0;i<programs[0].inputNames.size();i++)
{
fprintf(o,"%s,",programs[0].inputNames[i].c_str());
}
for(size_t i=0;i<programs[0].outputNames.size();i++)
{
fprintf(o,"%s,",programs[0].outputNames[i].c_str());
}
fprintf(o,"0);\n");

if (2 == typec)
{
fprintf(o,"\t} catch(int r){ \n");
fprintf(o,"\tif (1 == r) \n");
fprintf(o,"\t __total_halt++;\n");
fprintf(o,"\t printf(\"HALT HAS BEEN DETECTED.\\n\");\n");
fprintf(o,"\t printf(\"INPUT VARIABLES:\\n\");\n");

for(size_t i=0;i<programs[0].inputNames.size();i++)
{
fprintf(o,"\tprintf(\"%s = %%d\\n\",(int)%s_copy);\n",programs[0].inputNames[i].c_str(),programs[0].inputNames[i].c_str());
}

fprintf(o,"\t}\n");

for(size_t i=0;i<programs[0].inputNames.size();i++)
{
fprintf(o,"\t}\n");
}
}

if (2 != typec)
{
fprintf(o,"\tprintf(\"RESULTS:\\n\");\n");
for(size_t i=0;i<programs[0].outputNames.size();i++)
{
fprintf(o,"\tprintf(\"%s = %%d\",(int)%s);\n",programs[0].outputNames[i].c_str(),programs[0].outputNames[i].c_str());
}
}else
{
fprintf(o,"\tprintf(\"RESULTS:\\n\");\n");
fprintf(o,"\tprintf(\"total : %%d\\n\",__total);\n");
fprintf(o,"\tprintf(\"halted: %%d\\n\",__total_halt);\n");
fprintf(o,"\tprintf(\"passed: %%d\\n\",__total — __total_halt);\n");
fprintf(o,"\tprintf(\"Q = %%f\\n\",(double)__total_halt / (double)__total);\n");
}


/*fprintf(o,"\tprintf(\"RESULTS (inputs):\\n\");\n");
for(size_t i=0;i<programs[0].inputNames.size();i++)
{
fprintf(o,"\tprintf(\"%s = %%d\",(int)%s);\n",programs[0].inputNames[i].c_str(),programs[0].inputNames[i].c_str());
}*/

fprintf(o,"}\n\n");

fclose(f);
fclose(o);

return 0;
}

С Уважением,
Петр Петров
Третий Рим должен пасть!
Re[2]: Текст программы обнаружения зависаний опубликован
От: GhostCoders Россия  
Дата: 01.03.09 20:12
Оценка:
Да, забыл форматирования для исходного кода сделать, вот:


/*
 * Copyright (c) 2009 by
 * IP PETROV PETR PETROVICH.
 * All Rights Reserved
 *
 * This software comprises unpublished confidential information
 * including intellectual property of IP PETROV PETR PETROVICH.
 * and may not be used, copied or made available to anyone, except in
 * accordance with the licence under which it is furnished.
 *
 */

#include "stdafx.h"

#define INT8  0
#define UINT8 1

int typec = 0; // 0 -compile. 1- validate, 2 - test

struct subprogram
{
    std::string name;
    std::vector<std::string> inputNames;
    std::set<std::string> sinputNames;
    std::vector<int> inputTypes;
    std::vector<std::string> outputNames;
    std::set<std::string> soutputNames;
    std::vector<int> outputTypes;
    std::vector<std::string> varNames;
    std::set<std::string> svarNames;
    std::vector<int> varTypes;
};

std::vector<subprogram> subprograms;
std::vector<subprogram> programs;
std::set<std::string> subprogram_names;
std::set<std::string> program_names;
std::string curContext;

int counter = 0;

void _fillstate(FILE* f,FILE* o)
{
    counter++;

    subprogram * sp = 0;

    for(size_t i=0;i<subprograms.size();i++)
    {
        if (subprograms[i].name == curContext)
        {
            sp = &(subprograms[i]);
            break;
        }
    }
    for(size_t i=0;i<programs.size();i++)
    {
        if (programs[i].name == curContext)
        {
            sp = &(programs[i]);
            break;
        }
    }
    fprintf(o,"\t_curstate.line = %d;\n",counter++);

      fprintf(o,"\t_curstate.variables.clear();\n",counter++);
      for(size_t i=0;i<sp->inputNames.size();i++)
      {
          fprintf(o,"\t_curstate.variables.push_back(%s);\n",sp->inputNames[i].c_str());
      }
      for(size_t i=0;i<sp->outputNames.size();i++)
      {
          fprintf(o,"\t_curstate.variables.push_back(%s);\n",sp->outputNames[i].c_str());
      }
      for(size_t i=0;i<sp->varNames.size();i++)
      {
          fprintf(o,"\t_curstate.variables.push_back(%s);\n",sp->varNames[i].c_str());
      }
}

void __check(FILE* f,FILE* o)
{
    if (0 != typec)
    {
        _fillstate(f,o);
        fprintf(o,"\t__check(&_curstate);\n");
    }
}

int _subprogram(FILE* f,FILE* o,bool is_subprogram = true)
{
  subprogram newSubprogram;
  char name[5000] = { 0 };
  fscanf(f,"%s",name);
  if (subprogram_names.find(std::string(name)) != subprogram_names.end())
  {
      printf("error: subprogram %s is always defined\n",name);
      return 0;
  }
  if (program_names.find(std::string(name)) != program_names.end())
  {
      printf("error: subprogram %s is always defined\n",name);
      return 0;
  }
  curContext = std::string(name);
  newSubprogram.name = std::string(name);
  char next[5000] = { 0 };
  fscanf(f,"%s",next);
  while(strcmp(next,"BEGIN"))
  {
      if (!strcmp(next,"INPUT"))
      {
            char iname[5000] = { 0 };
            fscanf(f,"%s",iname);
            if (newSubprogram.sinputNames.find(std::string(iname)) != newSubprogram.sinputNames.end())
            {
                printf("error: input argument's name %s is always used\n",iname);
                return 0;
            }
            if (newSubprogram.soutputNames.find(std::string(iname)) != newSubprogram.soutputNames.end())
            {
                printf("error: input argument's name %s is always used\n",iname);
                return 0;
            }
            if (newSubprogram.svarNames.find(std::string(iname)) != newSubprogram.svarNames.end())
            {
                printf("error: input argument's name %s is always used\n",iname);
                return 0;
            }
            newSubprogram.sinputNames.insert(std::string(iname));
            newSubprogram.inputNames.push_back(std::string(iname));
            char typeKeyword[5000] = { 0 };
            fscanf(f,"%s",typeKeyword);
            if (strcmp(typeKeyword,"TYPE"))
            {
                printf("error: TYPE keyword is absent\n");
                return 0;
            }
            char _typename[5000] = { 0 };
            fscanf(f,"%s",_typename);
            if (!strcmp(_typename,"int8"))
            {
                newSubprogram.inputTypes.push_back(INT8);
            }else
            if (!strcmp(_typename,"uint8"))
            {
                newSubprogram.inputTypes.push_back(UINT8);
            }else
            {
                printf("error: unknown type %s\n",_typename);
                return 0;                
            }
      }else
      if (!strcmp(next,"OUTPUT"))
      {
            char oname[5000] = { 0 };
            fscanf(f,"%s",oname);
            if (newSubprogram.sinputNames.find(std::string(oname)) != newSubprogram.sinputNames.end())
            {
                printf("error: output argument's name %s is always used\n",oname);
                return 0;
            }
            if (newSubprogram.soutputNames.find(std::string(oname)) != newSubprogram.soutputNames.end())
            {
                printf("error: output argument's name %s is always used\n",oname);
                return 0;
            }
            if (newSubprogram.svarNames.find(std::string(oname)) != newSubprogram.svarNames.end())
            {
                printf("error: output argument's name %s is always used\n",oname);
                return 0;
            }
            newSubprogram.soutputNames.insert(std::string(oname));
            newSubprogram.outputNames.push_back(std::string(oname));
            char typeKeyword[5000] = { 0 };
            fscanf(f,"%s",typeKeyword);
            if (strcmp(typeKeyword,"TYPE"))
            {
                printf("error: TYPE keyword is absent\n");
                return 0;
            }
            char _typename[5000] = { 0 };
            fscanf(f,"%s",_typename);
            if (!strcmp(_typename,"int8"))
            {
                newSubprogram.outputTypes.push_back(INT8);
            }else
            if (!strcmp(_typename,"uint8"))
            {
                newSubprogram.outputTypes.push_back(UINT8);
            }else
            {
                printf("error: unknown type %s\n",_typename);
                return 0;                
            }
      }else
      if (!strcmp(next,"VAR"))
      {
            char vname[5000] = { 0 };
            fscanf(f,"%s",vname);
            if (newSubprogram.sinputNames.find(std::string(vname)) != newSubprogram.sinputNames.end())
            {
                printf("error: variable's name %s is always used\n",vname);
                return 0;
            }
            if (newSubprogram.soutputNames.find(std::string(vname)) != newSubprogram.soutputNames.end())
            {
                printf("error: variable's name %s is always used\n",vname);
                return 0;
            }
            if (newSubprogram.svarNames.find(std::string(vname)) != newSubprogram.svarNames.end())
            {
                printf("error: variable's name %s is always used\n",vname);
                return 0;
            }
            newSubprogram.svarNames.insert(std::string(vname));
            newSubprogram.varNames.push_back(std::string(vname));
            char typeKeyword[5000] = { 0 };
            fscanf(f,"%s",typeKeyword);
            if (strcmp(typeKeyword,"TYPE"))
            {
                printf("error: TYPE keyword is absent\n");
                return 0;
            }
            char _typename[5000] = { 0 };
            fscanf(f,"%s",_typename);
            if (!strcmp(_typename,"int8"))
            {
                newSubprogram.varTypes.push_back(INT8);
            }else
            if (!strcmp(_typename,"uint8"))
            {
                newSubprogram.varTypes.push_back(UINT8);
            }else
            {
                printf("error: unknown type %s\n",_typename);
                return 0;                
            }
      }else
      if (strcmp(next,"BEGIN"))
      {
         printf("error: waiting for BEGIN token\n");
         return 0;                
      }
      fscanf(f,"%s",next);
  }

  if (is_subprogram)
  {
    subprograms.push_back(newSubprogram);
    subprogram_names.insert(std::string(name));
  }else
  {
    programs.push_back(newSubprogram);
    program_names.insert(std::string(name));
  }

  fprintf(o,"void %s (",name);
  for(size_t i=0;i<newSubprogram.inputNames.size();i++)
  {
      if (newSubprogram.inputTypes[i] == INT8)
      {
        fprintf(o,"char ");
      }else
      if (newSubprogram.inputTypes[i] == UINT8)
      {
        fprintf(o,"unsigned char ");
      }
      fprintf(o,"&%s",newSubprogram.inputNames[i].c_str());
      fprintf(o,", ");
  }
  for(size_t i=0;i<newSubprogram.outputNames.size();i++)
  {
      if (newSubprogram.outputTypes[i] == INT8)
      {
        fprintf(o,"char ");
      }else
      if (newSubprogram.outputTypes[i] == UINT8)
      {
        fprintf(o,"unsigned char ");
      }
      fprintf(o,"&%s",newSubprogram.outputNames[i].c_str());
      fprintf(o,", ");
  }

  fprintf(o,"void* __dummy)\n");
  fprintf(o,"{\n");

  for(size_t i=0;i<newSubprogram.varNames.size();i++)
  {
      if (newSubprogram.varTypes[i] == INT8)
      {
        fprintf(o,"\tstatic char ");
      }else
      if (newSubprogram.varTypes[i] == UINT8)
      {
        fprintf(o,"\tstatic unsigned char ");
      }
      fprintf(o,"%s = 0;\n",newSubprogram.varNames[i].c_str());
  }
  for(size_t i=0;i<newSubprogram.outputNames.size();i++)
  {
      fprintf(o,"\t%s = 0;\n",newSubprogram.outputNames[i].c_str());
  }
  return 0; 
}

void _inco(FILE* f,FILE *o)
{
    __check(f,o);

    char vname[5000] = { 0 };
    fscanf(f,"%s",vname);

    fprintf(o,"\t%s++;\n",vname);

}

void _deco(FILE* f,FILE *o)
{
    __check(f,o);

    char vname[5000] = { 0 };
    fscanf(f,"%s",vname);

    fprintf(o,"\t%s--;\n",vname);
}

void _mulo(FILE *f,FILE* o)
{
    __check(f,o);

    char vname1[5000] = { 0 };
    fscanf(f,"%s",vname1);
    char vname2[5000] = { 0 };
    fscanf(f,"%s",vname2);
    char vname3[5000] = { 0 };
    fscanf(f,"%s",vname3);

    fprintf(o,"\t%s = %s * %s;\n",vname1,vname2,vname3);
}

void _set(FILE *f,FILE* o)
{
    __check(f,o);

    char vname1[5000] = { 0 };
    fscanf(f,"%s",vname1);
    char vname2[5000] = { 0 };
    fscanf(f,"%s",vname2);
    fprintf(o,"\t%s = %s;\n",vname1,vname2);
}

void _let(FILE *f,FILE* o)
{
    __check(f,o);

    char vname1[5000] = { 0 };
    fscanf(f,"%s",vname1);
    char vname2[5000] = { 0 };
    fscanf(f,"%s",vname2);
    fprintf(o,"\t%s = %s;\n",vname1,vname2);
}


void _divo(FILE *f,FILE* o)
{
    __check(f,o);

    char vname1[5000] = { 0 };
    fscanf(f,"%s",vname1);
    char vname2[5000] = { 0 };
    fscanf(f,"%s",vname2);
    char vname3[5000] = { 0 };
    fscanf(f,"%s",vname3);

    fprintf(o,"\t%s = %s / %s;\n",vname1,vname2,vname3);
}

void _modo(FILE *f,FILE* o)
{
    __check(f,o);

    char vname1[5000] = { 0 };
    fscanf(f,"%s",vname1);
    char vname2[5000] = { 0 };
    fscanf(f,"%s",vname2);
    char vname3[5000] = { 0 };
    fscanf(f,"%s",vname3);

    fprintf(o,"\t%s = %s %% %s;\n",vname1,vname2,vname3);
}

void _addo(FILE *f,FILE* o)
{
    __check(f,o);

    char vname1[5000] = { 0 };
    fscanf(f,"%s",vname1);
    char vname2[5000] = { 0 };
    fscanf(f,"%s",vname2);
    char vname3[5000] = { 0 };
    fscanf(f,"%s",vname3);

    fprintf(o,"\t%s = %s + %s;\n",vname1,vname2,vname3);
}

void _subo(FILE *f,FILE* o)
{
    __check(f,o);

    char vname1[5000] = { 0 };
    fscanf(f,"%s",vname1);
    char vname2[5000] = { 0 };
    fscanf(f,"%s",vname2);
    char vname3[5000] = { 0 };
    fscanf(f,"%s",vname3);

    fprintf(o,"\t%s = %s - %s;\n",vname1,vname2,vname3);
}

void _label(FILE *f,FILE* o)
{
    __check(f,o);

    char name[5000] = { 0 };
    fscanf(f,"%s",name);

    fprintf(o,"label_%s_%s:\n",curContext.c_str(),name);
}

void _goto(FILE *f,FILE* o)
{
    __check(f,o);

    char name[5000] = { 0 };
    fscanf(f,"%s",name);

    fprintf(o,"\tgoto label_%s_%s;\n",curContext.c_str(),name);
}

void _ifequal(FILE *f,FILE* o)
{
    __check(f,o);

    char a1[5000] = { 0 };
    fscanf(f,"%s",a1);
    char a2[5000] = { 0 };
    fscanf(f,"%s",a2);

    fprintf(o,"\tif( %s == %s ) {\n\t",a1,a2);

    char gotoK[5000] = { 0 };
    fscanf(f,"%s",gotoK);
    if (strcmp(gotoK,"GOTO"))
    {
        printf("error: waiting for GOTO keyword\n");
    }

        _goto(f,o);
    fprintf(o,"\t}\n");

    char e[5000] = { 0 };
    fscanf(f,"%s",e);
    if (!strcmp(e,"ELSE"))
    {
        fprintf(o,"\telse { \n\t");
        _goto(f,o);
        fprintf(o,"\t}\n");
    }else
    {
    }
}

void _ifgreat(FILE *f,FILE* o)
{
    __check(f,o);

    char a1[5000] = { 0 };
    fscanf(f,"%s",a1);
    char a2[5000] = { 0 };
    fscanf(f,"%s",a2);

    fprintf(o,"\tif( %s > %s ) {\n\t",a1,a2);

    char gotoK[5000] = { 0 };
    fscanf(f,"%s",gotoK);
    if (strcmp(gotoK,"GOTO"))
    {
        printf("error: waiting for GOTO keyword\n");
    }

        _goto(f,o);
    fprintf(o,"\t}\n");

    char e[5000] = { 0 };
    fscanf(f,"%s",e);
    if (!strcmp(e,"ELSE"))
    {
        fprintf(o,"\telse { \n\t");
        _goto(f,o);
        fprintf(o,"\t}\n");
    }else
    {
    }
}

void _ifless(FILE *f,FILE* o)
{
    __check(f,o);

    char a1[5000] = { 0 };
    fscanf(f,"%s",a1);
    char a2[5000] = { 0 };
    fscanf(f,"%s",a2);

    fprintf(o,"\tif( %s < %s ) {\n\t",a1,a2);

    char gotoK[5000] = { 0 };
    fscanf(f,"%s",gotoK);
    if (strcmp(gotoK,"GOTO"))
    {
        printf("error: waiting for GOTO keyword\n");
    }

        _goto(f,o);
    fprintf(o,"\t}\n");

    char e[5000] = { 0 };
    fscanf(f,"%s",e);
    if (!strcmp(e,"ELSE"))
    {
        fprintf(o,"\telse { \n\t");
        _goto(f,o);
        fprintf(o,"\t}\n");
    }else
    {
    }
}

void _call(FILE *f,FILE* o)
{
    __check(f,o);

    char fname[5000] = { 0 };
    fscanf(f,"%s",fname);    

    if (subprogram_names.find(std::string(fname)) != subprogram_names.end() )
    {
        for(size_t i=0;i<subprograms.size();i++)
        {
            if (subprograms[i].name == std::string(fname))
            {
                int ac = subprograms[i].inputNames.size() + subprograms[i].outputNames.size();
                fprintf(o,"\t%s ( ",fname);
                for(int k=0;k<ac;k++)
                {
                    char an[5000] = { 0 };
                    fscanf(f,"%s",an);    
                    fprintf(o,"%s,",an);
                }
                fprintf(o,"0);\n");

                break;
            }
        }
    }else
    {
        printf("error: subprogram is not founded %s\n",fname);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
  printf("Simple Language Translator 1.0\n");
  printf("Copyright (c) 2009 by\n");
  printf("IP PETR PETROV PETROVICH.\n");
  printf("All Rights Reserved.\n\n");

  if (argc < 3)
  {
      printf("Usage: inputfilename.sl ACTION\n");
      printf("\there ACTION can be the following:\n");
      printf("\tCOMPILEONLY: A Simple Language Program will be compiled to C++ only\n");
      printf("\tCOMPILEWITHVALIDATE: A Simple Language Program will be compiled to C++ with Halt-detection code\n");
      printf("\tTEST: A simple Language Program will be tested (analised)\n");
      return 0;
  }

  if (!strcmp(argv[2],"COMPILEONLY"))
  {
      typec = 0;
  }else
  if (!strcmp(argv[2],"COMPILEWITHVALIDATE"))
  {
      typec = 1;
  }else
  if (!strcmp(argv[2],"TEST"))
  {
      typec = 2;
  }else
  {
      printf("error: incorrect mode\n");
      return 0;
  }


  FILE *f = fopen(argv[1],"rt");
  if (0 == f)
  {
      printf("Could not open input file.\n");
      return 0;
  }

  std::string outfilename = std::string(argv[1]) + std::string(".cpp");
  FILE *o = fopen(outfilename.c_str(),"wt");

  if (0 == o)
  {
      printf("Could not create output file.\n");
      return 0;
  }

  fprintf(o,"// This file was generated by Simple Language Translator 1.0\n");
  fprintf(o,"// DO NOT EDIT THIS FILE\n\n");

  fprintf(o,"#include <stdio.h>\n\n");  

  //!!!!
  if (0 != typec)
  {
  fprintf(o,"#include <vector>\n\n");  
  fprintf(o,"struct _state{\n");  
  fprintf(o,"\tstd::vector<int> variables;\n");  
  fprintf(o,"\tint line;\n");  
  fprintf(o,"};\n\n");  

  fprintf(o,"std::vector<_state> _states;\n\n");  

  fprintf(o,"bool __compare(_state* s1,_state* s2)\n");  
  fprintf(o,"{\n");  
  fprintf(o,"\tif (s1->variables.size() != s2->variables.size()) return false;\n");  
  fprintf(o,"\tif (s1->line != s2->line) return false;\n");  
  fprintf(o,"\tfor(size_t i=0;i<s1->variables.size();i++)\n");  
  fprintf(o,"\t{\n");  
  fprintf(o,"\t\tif (s1->variables[i] != s2->variables[i]) return false;\n");  
  fprintf(o,"\t}\n");  
  fprintf(o,"\treturn true;\n");  
  fprintf(o,"}\n");  

  fprintf(o,"void __check(_state* s)\n");  
  fprintf(o,"{\n");  
  fprintf(o,"\tfor(size_t i=0;i<_states.size();i++)\n");  
  fprintf(o,"\t{\n");  
  fprintf(o,"\t\tif (__compare(s,&_states[i])) {\n");  
  if (1 == typec)
  {
  fprintf(o,"\t\t\tprintf(\"program has halted!\\n\");\n");
  fprintf(o,"\t\t\texit(1);\n");
  }else
  if (2 == typec)
  {
  fprintf(o,"\t\t\tthrow int(1);\n");
  }
  fprintf(o,"\t\t}\n");  
  fprintf(o,"\t}\n");  
  fprintf(o,"\t_states.push_back(*s);\n");  
  fprintf(o,"}\n\n");  
  fprintf(o,"_state _curstate;\n");  
  }

  bool comment = false;
  bool wasprogram = false;
  while(!feof(f))
  {
      char buff[5000] = { 0 };
      fscanf(f,"%s",buff);

      if (!strcmp(buff,"*"))
      {
        comment = !comment;
      }else
      {
          if (!comment)
          {
              if (!strcmp(buff,"SUBPROGRAM"))
              {
                 _subprogram(f,o,true);
              }else
              if (!strcmp(buff,"PROGRAM"))
              {
                  if (!wasprogram)
                  {
                    _subprogram(f,o,false);
                    wasprogram = true;
                  }else
                  {
                      printf("error: a program must be one in file\n");
                      return 0;
                  }
              }else
              if (!strcmp(buff,"INC"))
              {
                  _inco(f,o);
              }else
              if (!strcmp(buff,"DEC"))
              {
                  _deco(f,o);
              }else
              if (!strcmp(buff,"MUL"))
              {
                  _mulo(f,o);
              }else
              if (!strcmp(buff,"DIV"))
              {
                  _divo(f,o);
              }else
              if (!strcmp(buff,"MOD"))
              {
                  _modo(f,o);
              }else
              if (!strcmp(buff,"ADD"))
              {
                  _addo(f,o);
              }else
              if (!strcmp(buff,"SUB"))
              {
                  _subo(f,o);
              }else
              if (!strcmp(buff,"LABEL"))
              {
                  _label(f,o);
              }else
              if (!strcmp(buff,"GOTO"))
              {
                  _goto(f,o);
              }else
              if (!strcmp(buff,"IFEQUAL"))
              {
                  _ifequal(f,o);
              }else
              if (!strcmp(buff,"IFGREAT"))
              {
                  _ifgreat(f,o);
              }else
              if (!strcmp(buff,"IFLESS"))
              {
                  _ifless(f,o);
              }else
              if (!strcmp(buff,"CALL"))
              {
                  _call(f,o);
              }else
              if (!strcmp(buff,"SET"))
              {
                  _set(f,o);
              }else
              if (!strcmp(buff,"LET"))
              {
                  _let(f,o);
              }else
              if (!strcmp(buff,"END"))
              {
                  fprintf(o,"\t;\n}\n");
              }
          }
      }
      
      //fprintf(o,"//%s\n",buff);
  }

  fprintf(o,"int main(int argc,char **argv)\n");
  fprintf(o,"{\n");

  if (0 == programs.size())
  { 
      printf("error: no program\n");
      return 0;
  }

  if (2 != typec)
  {
    fprintf(o,"\tint __temporary_var = 0;\n");
  }

  for(size_t i=0;i<programs[0].inputNames.size();i++)
  {
      if (programs[0].inputTypes[i] == INT8)
      {
        fprintf(o,"\tstatic char ");
      }else
      if (programs[0].inputTypes[i] == UINT8)
      {
        fprintf(o,"\tstatic unsigned char ");
      }
      if (2 == typec)
      {
        fprintf(o,"%s = 0, %s_copy = 0;\n",programs[0].inputNames[i].c_str(),programs[0].inputNames[i].c_str());
      }else
      {
        fprintf(o,"%s = 0;\n",programs[0].inputNames[i].c_str());
      }
      if (2 != typec)
      {
          fprintf(o,"\tprintf(\"enter input variable %s:\\n\");\n",programs[0].inputNames[i].c_str());
          fprintf(o,"\tscanf(\"%%d\",&__temporary_var);\n");

          if (programs[0].inputTypes[i] == INT8)
          {
            fprintf(o,"\t%s = (char)__temporary_var;\n",programs[0].inputNames[i].c_str());
          }else
          if (programs[0].inputTypes[i] == UINT8)
          {
            fprintf(o,"\t%s = (unsigned char)__temporary_var;\n",programs[0].inputNames[i].c_str());
          }
      }
   
  }

  int c1 = 0;
  if (2 == typec)
  {
      fprintf(o,"\tint __total = 0;\n");
      fprintf(o,"\tint __total_halt = 0;\n");
      for(size_t i=0;i<programs[0].inputNames.size();i++)
      {
          if (programs[0].inputTypes[i] == INT8)
          {
              c1++;
             fprintf(o,"\tfor(int i%d=0;i%d<=255;i%d++)\n",c1,c1,c1);
             fprintf(o,"\t{\n");
             fprintf(o,"\t%s = (char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
             fprintf(o,"\t%s_copy = (char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
          }else
          if (programs[0].inputTypes[i] == UINT8)
          {
              c1++;
             fprintf(o,"\tfor(int i%d=-128;i%d<=127;i%d++)\n",c1,c1,c1);
             fprintf(o,"\t{\n");
             fprintf(o,"\t%s = (unsigned char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
             fprintf(o,"\t%s_copy = (unsigned char)i%d;\n",programs[0].inputNames[i].c_str(),c1);
          }
      }
  }

  for(size_t i=0;i<programs[0].outputNames.size();i++)
  {
      if (programs[0].outputTypes[i] == INT8)
      {
        fprintf(o,"\tstatic char ");
      }else
      if (programs[0].outputTypes[i] == UINT8)
      {
        fprintf(o,"\tstatic unsigned char ");
      }
      fprintf(o,"%s = 0;\n",programs[0].outputNames[i].c_str());
  }

  if (2 == typec)
  {
      fprintf(o,"\ttry { \n");
      fprintf(o,"\t__total++;\n");
      fprintf(o,"\t_states.clear();\n");
  }

  fprintf(o,"\t%s (",programs[0].name.c_str());
  for(size_t i=0;i<programs[0].inputNames.size();i++)
  {
      fprintf(o,"%s,",programs[0].inputNames[i].c_str());
  }
  for(size_t i=0;i<programs[0].outputNames.size();i++)
  {
      fprintf(o,"%s,",programs[0].outputNames[i].c_str());
  }
  fprintf(o,"0);\n");

  if (2 == typec)
  {
      fprintf(o,"\t} catch(int r){ \n");
      fprintf(o,"\tif (1 == r) \n");
      fprintf(o,"\t __total_halt++;\n");
      fprintf(o,"\t printf(\"HALT HAS BEEN DETECTED.\\n\");\n");
      fprintf(o,"\t printf(\"INPUT VARIABLES:\\n\");\n");

  for(size_t i=0;i<programs[0].inputNames.size();i++)
  {
      fprintf(o,"\tprintf(\"%s = %%d\\n\",(int)%s_copy);\n",programs[0].inputNames[i].c_str(),programs[0].inputNames[i].c_str());
  }

      fprintf(o,"\t}\n");

      for(size_t i=0;i<programs[0].inputNames.size();i++)
      {
          fprintf(o,"\t}\n");
      }
  }

  if (2 != typec)
  {
      fprintf(o,"\tprintf(\"RESULTS:\\n\");\n");
      for(size_t i=0;i<programs[0].outputNames.size();i++)
      {
          fprintf(o,"\tprintf(\"%s = %%d\",(int)%s);\n",programs[0].outputNames[i].c_str(),programs[0].outputNames[i].c_str());
      }
  }else
  {
      fprintf(o,"\tprintf(\"RESULTS:\\n\");\n");
      fprintf(o,"\tprintf(\"total : %%d\\n\",__total);\n");
      fprintf(o,"\tprintf(\"halted: %%d\\n\",__total_halt);\n");
      fprintf(o,"\tprintf(\"passed: %%d\\n\",__total - __total_halt);\n");
      fprintf(o,"\tprintf(\"Q =  %%f\\n\",(double)__total_halt / (double)__total);\n");
  }


  /*fprintf(o,"\tprintf(\"RESULTS (inputs):\\n\");\n");
  for(size_t i=0;i<programs[0].inputNames.size();i++)
  {
      fprintf(o,"\tprintf(\"%s = %%d\",(int)%s);\n",programs[0].inputNames[i].c_str(),programs[0].inputNames[i].c_str());
  }*/

  fprintf(o,"}\n\n");

  fclose(f);
  fclose(o);

    return 0;
}
Третий Рим должен пасть!
Re[22]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 20:48
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Курилка, Вы писали:


FR>>>А разве общее множество всех формул не несчетно?


К>>Ну по идее есть же Гёделева нумерация (базис доказательства теоремы Гёделя), так что вполне себе счётно.


FR>Склероз мне подсказывает теорему Кантора

А толку?
FR>И этот же склероз подсказывает что Геделева нумерация как раз и выделяет счетное подмножество вычислимых формул из общего несчетного множества формул вообще (под формулой имеется в виду отображение счетного множества на четное же множество)
Ничего она не выделяет, какие-то это твои домыслы. А счётное множество счётных множеств (наверное, ты это имел в виду под отображением) ровно также счётно. Тебя ведь не удивляет тот факт, что мощность множества рациональных чисел счётно?
Re[10]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 01.03.09 20:59
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, GhostCoders, Вы писали:


FR>>>Про пи не знаю но тот же Аттрактор Лоренца не требует дополнительной памяти и при этом псевдослучаен. Да и теже детерминированные фракталы тоже можно вычислять на ограниченой памяти.


GC>>Только ПСЕВдослучаен.


FR>Угу, только есть пробема чтобы узнать эту псевдослучайную последовательность ее надо вычислять, а сходимость в заисимости от начальных условий, на современых машинах, у тех же аттракторов может быть от долей секунд до миллиардов лет.


Можете дать ссылку на такой Аттрактор? Очень интересно
Третий Рим должен пасть!
Re[9]: Реализован простейший язык для тестирования на зацик
От: . Великобритания  
Дата: 01.03.09 21:50
Оценка:
GhostCoders wrote:

> Я хочу вам показать одну вещь.

> Есть БОЛЬШАЯ разница между абстрактным алгоритмом вообще и его
> реализаией на реальной вычислительной машине.
Кто бы мог подумать?!

> Абстрактные алгоритмы используют понятие числа, переменной и т.д.

> Но никто эти числа не ограничивает никак. В вычислителных машинах мы
> используем ограниченные области памяти для
> хранения чисел — байты, слова, 32 битные значения, сейчас уже на 64 бит
> перешли.
А вот в криптографии легко используют 4096-битные числа. Вот негодяи.
А ещё можно написать алгоритм, который будет использовать совсем немного памяти, но работать настолько долго, что это будет практически бесконечно.

> Вот в этом и главная разница. Абстрактный алгоритм может уйти в

> бесконечность,
Почитай о понятии "потенциальная бесконечность".

> наш же реальный переполнится в какой-либо переменной, после

> максимального значения, переменная установиться в значение 0.
Переполнится когда? И почему ты решил, что обязательно переполнится? А вдруг не переполнится, просто закончит работу через 10^1000 лет?

> С помощью простейшего языка я методом перебора могу тебе дать гарантию

> что он не зависнит, например, на 10000 входных значений.
Молодец. Только зачем это нужно?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[21]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 01.03.09 21:55
Оценка:
Курилка wrote:

> Ну по идее есть же Гёделева нумерация

> <http://en.wikipedia.org/wiki/Goedel_numbering&gt; (базис доказательства
> теоремы Гёделя), так что вполне себе счётно.
Так это для некоего заданного формального языка (т.е. is a set of words, i.e. finite strings of letters, or symbols).

Но количество самих формальных языков — несчётно.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[10]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 01.03.09 22:04
Оценка:
Здравствуйте, ., Вы писали:

>> С помощью простейшего языка я методом перебора могу тебе дать гарантию

>> что он не зависнит, например, на 10000 входных значений.
.>Молодец. Только зачем это нужно?

В системах реального времени например. Даже могу дать гарантию что алгоритм будет выполняться не дольше чем
N шагов.

Когда есть информация для каждого входного набора за сколько шагов выполняется алгоритм такую информацию можно дать.
Всякие средние можно вычислять, минимумы, максимумы.
Третий Рим должен пасть!
Re[22]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.03.09 22:05
Оценка:
Здравствуйте, ., Вы писали:

.>Курилка wrote:


>> Ну по идее есть же Гёделева нумерация

>> <http://en.wikipedia.org/wiki/Goedel_numbering&gt; (базис доказательства
>> теоремы Гёделя), так что вполне себе счётно.
.>Так это для некоего заданного формального языка (т.е. is a set of words, i.e. finite strings of letters, or symbols).

.>Но количество самих формальных языков — несчётно.


Докажи.
По-моему для языков можно также ввести нумерацию (формального доказательства не дам ) и получим счётное множество счётных множеств.
Re[10]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 01.03.09 22:11
Оценка:
Здравствуйте, ., Вы писали:

.>GhostCoders wrote:


>> Я хочу вам показать одну вещь.

>> Есть БОЛЬШАЯ разница между абстрактным алгоритмом вообще и его
>> реализаией на реальной вычислительной машине.
.>Кто бы мог подумать?!

>> Абстрактные алгоритмы используют понятие числа, переменной и т.д.

>> Но никто эти числа не ограничивает никак. В вычислителных машинах мы
>> используем ограниченные области памяти для
>> хранения чисел — байты, слова, 32 битные значения, сейчас уже на 64 бит
>> перешли.
.>А вот в криптографии легко используют 4096-битные числа. Вот негодяи.
.>А ещё можно написать алгоритм, который будет использовать совсем немного памяти, но работать настолько долго, что это будет практически бесконечно.

Да так оно и есть. Мой алгоритм будет анализировать его тоже много времени, практически бесконечно.

Но есть случаи когда мой алгоритм полезен. Это например, когда алгоритм зацикливается со сравнительно
небольшим временем работы. Такие зацикливания можно определять и делать для них юнит тесты
Третий Рим должен пасть!
Re[23]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 01.03.09 22:34
Оценка:
Курилка wrote:

> Докажи.

Диагонализацией доказывается.

> По-моему для языков можно также ввести нумерацию (формального

> доказательства не дам ) и получим счётное множество счётных множеств.
Счётное множество счётных множеств — счётно.

Какой бы мы язык не вводили, он всегда будет определять не более, чем конструктивное множество объектов.
Скажем, все действительные числа описать формальным языком нельзя.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[11]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 01.03.09 22:47
Оценка:
GhostCoders wrote:

>> > С помощью простейшего языка я методом перебора могу тебе дать гарантию

>> > что он не зависнит, например, на 10000 входных значений.
> .>Молодец. Только зачем это нужно?
> В системах реального времени например. Даже могу дать гарантию что
> алгоритм будет выполняться не дольше чем
> N шагов.
Кому это нужно? Для таких тривиальных алгоритмов с 10000 значений проще заполнить таблицу в памяти, будет занимать всего 10кб.

> Когда есть информация для каждого входного набора за сколько шагов

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

> Да так оно и есть. Мой алгоритм будет анализировать его тоже много времени, практически бесконечно.

И накой он тогда?

> Но есть случаи когда мой алгоритм полезен. Это например, когда алгоритм

А я тоже алгоритм придумал — если в программе встречается число 42, то она зависнет.

> зацикливается со сравнительно небольшим временем работы. Такие зацикливания можно определять и делать для них юнит тесты

Вот у тебя есть алгоритм, который на вход берёт 2 числа длиной до 1000 десятичных цифр и выдаёт на выходе их произведение. Но из-за ошибки он зависает на числах 42*12345678901234567890. Оцени шанс, что твой алгоритм найдёт эту пару.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[12]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 01.03.09 23:16
Оценка:
Здравствуйте, ., Вы писали:

.>GhostCoders wrote:


>>> > С помощью простейшего языка я методом перебора могу тебе дать гарантию

>>> > что он не зависнит, например, на 10000 входных значений.
>> .>Молодец. Только зачем это нужно?
>> В системах реального времени например. Даже могу дать гарантию что
>> алгоритм будет выполняться не дольше чем
>> N шагов.
.>Кому это нужно? Для таких тривиальных алгоритмов с 10000 значений проще заполнить таблицу в памяти, будет занимать всего 10кб.

Ну существует же анализатор в принципе-то.... вот это я пытаюсь доказать

>> Когда есть информация для каждого входного набора за сколько шагов

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

>> Да так оно и есть. Мой алгоритм будет анализировать его тоже много времени, практически бесконечно.

.>И накой он тогда?

Ну существует же анализатор в принципе-то.... вот это я пытаюсь доказать

>> Но есть случаи когда мой алгоритм полезен. Это например, когда алгоритм

.>А я тоже алгоритм придумал — если в программе встречается число 42, то она зависнет.

>> зацикливается со сравнительно небольшим временем работы. Такие зацикливания можно определять и делать для них юнит тесты

.>Вот у тебя есть алгоритм, который на вход берёт 2 числа длиной до 1000 десятичных цифр и выдаёт на выходе их произведение. Но из-за ошибки он зависает на числах 42*12345678901234567890. Оцени шанс, что твой алгоритм найдёт эту пару.

Вероятность будет мизерной.
Третий Рим должен пасть!
Re[11]: Реализован простейший язык для тестирования на заци
От: Alexey F  
Дата: 01.03.09 23:43
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Да так оно и есть. Мой алгоритм будет анализировать его тоже много времени, практически бесконечно.


Об этом как раз и говорил Тьюринг — подобные анализаторы бесполезны, т.к. будут работать столько же по времени, сколько и алгоритм >_<

Ну существует же анализатор в принципе-то.... вот это я пытаюсь доказать

Какая разница, существует ли бесполезный анализатор или нет? Да и какой это "анализатор", честно говоря... Когда он не анализирует, а выполняет алгоритм. Что он ещё делает — см. ниже.

GC>Но есть случаи когда мой алгоритм полезен. Это например, когда алгоритм зацикливается со сравнительно

GC>небольшим временем работы. Такие зацикливания можно определять и делать для них юнит тесты
Прекрасно. Но зачем было писать, что у Вас есть:

AF>Алан Тьюринг доказал в 1936 году, что общий алгоритм для решения проблемы зависания для любых возможных входных данных не может существовать. Мы можем сказать, что проблема зависания неразрешима на машине Тьюринга.

Это я уже давно знаю. Я смогу доказать что такие методы есть и работают.


Вся фишка в том, что результаты будут 100% однозначные и 100% достоверные.

т.е. что есть метод, который на все 100% для любого алгоритма всё раскажет и покажет?

Думаю, что из релиза Вы бы выкинули полный перебор всех вариантов, а таки сделали бы анализатор, который по условиям if и циклов подбирал бы только граничные значения (скажем, на условие if ( a < 0 ) { ... } можно взять два граничных значения: a < 0 (a == -1) и a > 0 (a == 1)). Да, это хорошая идея — если состояния начали повторяться, значит, код зависнет. Да, количество состояний конечно! Нельзя перехитрить такой анализатор, только сделать так, чтобы он "анализировал" до конца света... Или исчерпал всю свободную память.
Но Вы же сами говорили, что в отличие от машины Тьюринга, память у компьютеров ограничена. В какой такой памяти Вы будете хранить состояния вычислений?
int64_t func ( int64_t const a, int const b ) {
    for ( int64_t i = 0; i < b; ++i ) {
        if ( a + i + b == SOMETHING_CONST ) {
            return i;
        }
    }
    return 0;
}

Здесь всего лишь одна переменная, всё остальное — константы. Но всё равно, Вы задумались, где будете хранить максимум 2^64 8-байтных состояний этой простейшей функции?
А так:
double func2 ( double const a ) {
    for ( double i = 0; i < a; i += 0.000001 ) {
        double b = 42 * sqrt ( a + i );
        double c = 16 - b + i;
        if ( ( b * 2. ) - ( c / 2. ) + pow ( 2., i ) == SOMETHING_CONST ) {
            return i;
        }
    }
    return 0;
}

Это сколько памяти надо? Изменяются i, изменяется b, c тоже изменяется! А количество вызовов? При достаточно большом "a" это сколько памяти под состояния уйдёт и сколько она будет сравниваться с предыдущими? А если эти два метода вызываются из третьей функции? Или хотя бы первый метод вызывается пару раз из третьей функции.

Говорите, что ограничения современных компьютеров позволяют использовать Ваш метод и совершенно не учитываете, что Вашему методу нужен компьютер с нереально огромным количеством памяти Причём стремящегося к бесконечности для подавляющего большинства случаев

Какая разница между Вашим анализатором и анализируемой программой? Когда они оба выполняют один и тот же код? Почему бы просто не запустить оригинал и не посмотреть, завис он или нет? Ну хранит "анализатор" состояния и что? Знаете, насколько тривиальными должны быть случаи, чтобы этот анализатор работал разумное время и не съел всю доступную память? А с такими тривиальными случаями может справиться и человек.

Вот если бы анализировался исходный код, проверялись граничные условия, что-нибудь_ещё,_что_неизвестно_и_поэтому_нет_решения_проблемы_останова и всё это без запуска целевой программы... Тогда бы я понял поднятую здесь шумиху, разговоры о математике, ссылки на статьи и т.п.
Re[12]: Реализован простейший язык для тестирования на заци
От: Alexey F  
Дата: 01.03.09 23:57
Оценка:
Здравствуйте, Alexey F, Вы писали:

Вдогонку: ещё один пример, который не возьмёшь методом, основанным на сохранении состояний.
Сортировка массивов.
Да, обычная сортировка, хоть пузырьком, хоть быстрая.
Если, скажем, размер массива 5 миллиардов элементов (64-битная система), а для индексы использованы 32-битные — то она может зависнуть... Но прежде зависнет/грохнется анализатор, который не смог переварить такой объём данных. Это при том, что сортировка довольна элементарна (тот же пузырёк) и в самой программе, в большинстве случаев, используется для коротких массивов...
Re[13]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 02.03.09 00:11
Оценка: +1
GhostCoders wrote:

> Ну существует же анализатор в принципе-то.... вот это я пытаюсь доказать

Существует способ перебрать 10000 значений? Алгоритм brute force думаю придумали сотни лет назад.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[11]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 04:09
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Можете дать ссылку на такой Аттрактор? Очень интересно


здесь
Re[23]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 04:19
Оценка:
Здравствуйте, Курилка, Вы писали:

FR>>Склероз мне подсказывает теорему Кантора

К>А толку?
FR>>И этот же склероз подсказывает что Геделева нумерация как раз и выделяет счетное подмножество вычислимых формул из общего несчетного множества формул вообще (под формулой имеется в виду отображение счетного множества на четное же множество)
К>Ничего она не выделяет, какие-то это твои домыслы. А счётное множество счётных множеств (наверное, ты это имел в виду под отображением) ровно также счётно. Тебя ведь не удивляет тот факт, что мощность множества рациональных чисел счётно?

Множество всех подмножеств счетного множества несчетно, это и есть теорема Кантора, и именно на ней базируется доказательство теоремы Геделя. В общем дальше надо искать учебники и смотреть, склероз
Re[24]: Реализован простейший язык для тестирования на заци
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.03.09 05:41
Оценка:
Здравствуйте, ., Вы писали:

.>Курилка wrote:


>> Докажи.

.>Диагонализацией доказывается.
Ну вот и докажи

>> По-моему для языков можно также ввести нумерацию (формального

>> доказательства не дам ) и получим счётное множество счётных множеств.
.>Счётное множество счётных множеств — счётно.

.>Какой бы мы язык не вводили, он всегда будет определять не более, чем конструктивное множество объектов.

.>Скажем, все действительные числа описать формальным языком нельзя.

Т.е. ты говоришь, что есть формулы, которые записываются не языком, а чем-то ещё?
Приведи пример.
Re[25]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 05:45
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Т.е. ты говоришь, что есть формулы, которые записываются не языком, а чем-то ещё?

К>Приведи пример.

Та же проблема останова. Ее нельзя выразить в виде алгоритма. Но существовать как абстрактной формуле ей никто ни запрещает.
Re[2]: Текст программы обнаружения зависаний опубликован
От: FR  
Дата: 02.03.09 06:35
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

GC> Смысл в следующем. Что цикл зависания не может превосходить число внутренних состояний такой машины.


То есть твой анализатор практически бесполезен
Re[14]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 02.03.09 07:37
Оценка:
Здравствуйте, ., Вы писали:

.>GhostCoders wrote:


>> Ну существует же анализатор в принципе-то.... вот это я пытаюсь доказать

.>Существует способ перебрать 10000 значений? Алгоритм brute force думаю придумали сотни лет назад.

однако каков будет по твоему критерий останова?

например наш алгоритм выполняется, выполняется.... как определить что он завис?
Третий Рим должен пасть!
Re[12]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 02.03.09 08:00
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Какая разница, существует ли бесполезный анализатор или нет? Да и какой это "анализатор", честно говоря... Когда он не анализирует, а выполняет алгоритм. Что он ещё делает — см. ниже.


Тут стирается граница между анализом и выполнением.
У нас есть M состояний (к сожаления M бывает часто огромным).
Из каждого состояния S (которое есть элемент множества M) мы детерминированно переходим
в другое состояние S*.
Есть подмножество M, которое есть начальные состояния (отличаются лишь входными данными).
Есть подмножество M, которое есть конечные состояния (на последней строке алгоритма, отличаются лишь состоянием резудьтирующих и временных переменных).

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

Так что выполнение программы в этом случае сродни анализу графа,
путешествие по траектории смены состояний.

Есть быстрый способ проверить переходим ли мы из состояния S в состояние S* (за один шаг).
Однако нет быстрого способа определить наличие циклов в таком графе.


AF>Вот если бы анализировался исходный код, проверялись граничные условия, что-нибудь_ещё,_что_неизвестно_и_поэтому_нет_решения_проблемы_останова и всё это без запуска целевой программы... Тогда бы я понял поднятую здесь шумиху, разговоры о математике, ссылки на статьи и т.п.


Можно скажем ожидать зависания на на всех строках программы, а только на тех где есть условные переходы.
Запоминать состояние не всех переменных, о только тех, которые влияют на состояние переменных, участвующих в условии.
Незнаю насколько это
Третий Рим должен пасть!
Re[10]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 02.03.09 08:14
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Получается что так.

AF>[/q]
AF>Получено решение не для общего случая, а для частного — когда система "замкнута". Неразрешимая проблема осталась таковой.

Машина Тьюринга также замкнута, у нее нет функций ввода-вывода с пользоватлелем.
Задается начальное состояние и вуаля — вперед.


Бесконечная лента хранит в каждой ячейке символ. Так что полное состояние системы бесконечно.
Третий Рим должен пасть!
Re[3]: Реализован простейший язык для тестирования на зацик
От: Voblin Россия http://maslyaew.narod.ru/
Дата: 02.03.09 08:50
Оценка: 1 (1) :)))
Здравствуйте, GhostCoders, Вы писали:

AF>>

AF>>"Если где-либо в дробной части числа "пи" встречается последовательность цифр 84327411834783744390087539249 — завершить цикл"

AF>>Что на это скажет анализатор?

GC>По хорошему, мы должны использовать переменную с бесконечным числом бит, но

GC>у нас никогда не будет компьютера с бесконечной памятью. Машина Тьюринга, имеет бесконечную память.

Есть способ быстрого вычисления произвольной двоичной цифры числа пи без вычисления предыдущих цифр (см. ссылку здесь). Предлагается его запрограммить и прогнать через анализатор. Десятичную последовательность "843274118..." искать тяжеловато. Предлагается определить, содержится ли в двоичном представлении числа пи представление (например, Windows-1251) фразочки "Алан Тьюринг что-то накосячил со своей теоремой".
Re[15]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 02.03.09 08:51
Оценка:
GhostCoders wrote:

> однако каков будет по твоему критерий останова?

А у тебя какой?

> например наш алгоритм выполняется, выполняется.... как определить что он

> завис?
Ограничить максимальное количество шагов.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[25]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 02.03.09 08:58
Оценка: +1
Курилка wrote:

>> > Докажи.

> .>Диагонализацией доказывается.
> Ну вот и докажи
Да то же доказательство, что для действительных чисел. Построить таблицу "всех" формальных языков и выбирать с каждым элементом неравный язык. В общем в таком док-ве есть некие тонкие моменты, проще свести к действительным числам и сослаться уже на доказанную теорему.

> Т.е. ты говоришь, что есть формулы, которые записываются не языком, а

> чем-то ещё?
> Приведи пример.
Нет, проблема в том, что ты не можешь создать 1 такой язык, который будет описывать все возможные формулы.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[16]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 02.03.09 09:34
Оценка:
Здравствуйте, ., Вы писали:

.>GhostCoders wrote:


>> однако каков будет по твоему критерий останова?

.>А у тебя какой?

Если мы перешли в предыдущее состояние, в котором раньше уже были — то значить зависли.

>> например наш алгоритм выполняется, выполняется.... как определить что он

>> завис?
.>Ограничить максимальное количество шагов.

В твоем случае ты всегда будешь дожидаться этого максимального числа шагов, чтобы определить зависание алгоритма.
В моем это возможно намного раньше.

Плюс если алгоритм долго выполняется это не значить что он завис. Если же он перешел в одно из предыдуших состояний,
100% что он завис.
Третий Рим должен пасть!
Re[13]: Реализован простейший язык для тестирования на заци
От: Alexey F  
Дата: 02.03.09 09:47
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Тут стирается граница между анализом и выполнением.

А не должна.

GC>Можно скажем ожидать зависания на на всех строках программы, а только на тех где есть условные переходы.

GC>Запоминать состояние не всех переменных, о только тех, которые влияют на состояние переменных, участвующих в условии.
GC>Незнаю насколько это
Повторюсь: с массивами что делать? Не всех переменных — хорошо, только срезать из них множно будет немного.
Отсюда, например, не срезать ни i, ни j, ни k:
for ( int i = 0; i < x; ++i ) {
    for ( int j = 0; j < i; ++j ) {
        for ( int k = 0; k < j; ++k ) {
            // ...
        }
    }
}
Re[14]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 09:55
Оценка: +1
Здравствуйте, Alexey F, Вы писали:

AF>Повторюсь: с массивами что делать? Не всех переменных — хорошо, только срезать из них множно будет немного.

AF>Отсюда, например, не срезать ни i, ни j, ни k:

Да не нужно массивов, достаточно рекурсивных функций фибоначи или аккермана, там переменных то пара штук, но комбинаторный взрыв на числе вызовов, никакой памяти это проанализировать не хватит.
Re[11]: Реализован простейший язык для тестирования на заци
От: Alexey F  
Дата: 02.03.09 10:02
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Машина Тьюринга также замкнута, у нее нет функций ввода-вывода с пользоватлелем.

GC>Задается начальное состояние и вуаля — вперед.

GC>Бесконечная лента хранит в каждой ячейке символ. Так что полное состояние системы бесконечно.


А Тьюринг уже доказал, что решения проблемы останова для машины Тьюринга нет.

Замкнутый круг — с одной стороны, Вы ориентируетесь на современные компьютеры, с другой — Вам нужно нечто вроде машины Тьюринга с бесконечной памятью, чтобы Ваш анализатор мог нормально работать.

А цитированое выше вообще не понимаю, зачем Вы привели. Если количество состояний системы бесконечно, то какая разница, есть у неё ввод/вывод или нет? Фактически и на современных компьютерах большое число состояний (которые могут повторяться, но потом переходить в отличные от прошлых разов состояния) можно получить, всего лишь добавив ввод/вывод.


Я теперь понимаю, почему Вы не хотели принимать пример с числом "пи". Анализатор просто не сможет его разгрызть.
GhostCoders, не закрывайте глаза на контрпримеры, коих приводили уже множество.

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

Не надо больше, всё равно это уже немногим интересно
Re[2]: Текст программы обнаружения зависаний опубликован
От: Voblin Россия http://maslyaew.narod.ru/
Дата: 02.03.09 10:08
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC> Хочется сказать, что многие программисты, изучая в институте машину Тьюринга,

GC> конечно слышили о проблеме неразрешимости, так же как и о "вечном двигателе" и попытках создать его.
GC> Но есть одно НО, машина Тьюринга бесконечна, для конечных машин, проблема зависания все же
GC> РАЗРЕШИМА, хотя бы в теории. Про это обычно забывают, и в английской вики про это пишут,
GC> что это распространенное заблуждение, что неразрешимость проблемы машины Тьюринга переносят
GC> на конечные компьютеры. http://en.wikipedia.org/wiki/Halting_problem — сомтрите "Common pitfalls".

Не знаю, что там где пишут, но если посмотреть на доказательство теоремы про неразрешимость проблемы останова, то там про бесконечность машины ничего не сказано. Просто оказывается не очень сложно сконструировать такие исходные данные для "универсального решателя проблемы останова", при которых и ответ "да", и ответ "нет" оказываются неправильными. Типа парадокса брадобрея.
Re[15]: Реализован простейший язык для тестирования на заци
От: Alexey F  
Дата: 02.03.09 10:13
Оценка:
Здравствуйте, FR, Вы писали:

AF>>Повторюсь: с массивами что делать? Не всех переменных — хорошо, только срезать из них множно будет немного.

AF>>Отсюда, например, не срезать ни i, ни j, ни k:

FR>Да не нужно массивов, достаточно рекурсивных функций фибоначи или аккермана, там переменных то пара штук, но комбинаторный взрыв на числе вызовов, никакой памяти это проанализировать не хватит.


Та я уже не знаю, что ещё в пример привести
Те примеры, на которые "анализатор" не может вразумительно ответить, GhostCoders пропускаются. А работает "анализатор" в "простейших случаях": что считать простейшими случаями — непонятно... Там чуть ли не одного цикла достаточно, чтобы случай резко перестал быть простейшим. А, спрашивается, зачем такой анализатор, который должен искать зависания но не может анализировать циклы?
Re[16]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 02.03.09 10:26
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, FR, Вы писали:


AF>>>Повторюсь: с массивами что делать? Не всех переменных — хорошо, только срезать из них множно будет немного.

AF>>>Отсюда, например, не срезать ни i, ни j, ни k:

FR>>Да не нужно массивов, достаточно рекурсивных функций фибоначи или аккермана, там переменных то пара штук, но комбинаторный взрыв на числе вызовов, никакой памяти это проанализировать не хватит.


AF>Та я уже не знаю, что ещё в пример привести

AF>Те примеры, на которые "анализатор" не может вразумительно ответить, GhostCoders пропускаются. А работает "анализатор" в "простейших случаях": что считать простейшими случаями — непонятно...

простейшие случаи — это

1. программа зависает с периодом смены состояний не очень большим (ну скажем до миллиарда на наших компьютерах)
2. тратит на выполнение не больше миллиарда шагов
Третий Рим должен пасть!
Re[25]: Реализован простейший язык для тестирования на заци
От: Cyberax Марс  
Дата: 02.03.09 10:27
Оценка:
Здравствуйте, Курилка, Вы писали:

>>> Докажи.

.>>Диагонализацией доказывается.
К>Ну вот и докажи
http://en.wikipedia.org/wiki/Cantor%27s_diagonal_argument

.>>Какой бы мы язык не вводили, он всегда будет определять не более, чем конструктивное множество объектов.

.>>Скажем, все действительные числа описать формальным языком нельзя.
К>Т.е. ты говоришь, что есть формулы, которые записываются не языком, а чем-то ещё?
Да. Какой бы ты ни выбирал формализм, а всё равно останутся действительные числа, которые в нём нельзя построить явно.

Например, множество всех действительных чисел, которые являются решением какого-нибудь алгебраического уравнения, называются "алгебраическими числами". Но они не покрывают все действительные числа.
Sapienti sat!
Re[4]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 02.03.09 10:31
Оценка: :)
Здравствуйте, Voblin, Вы писали:

V>Предлагается определить, содержится ли в двоичном представлении числа пи представление (например, Windows-1251) фразочки "Алан Тьюринг что-то накосячил со своей теоремой".

Есть. Только вот не скажу где

http://www.netfunny.com/rhf/jokes/01/Jun/pi.html
Sapienti sat!
Re[12]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 02.03.09 10:31
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, GhostCoders, Вы писали:


AF>Замкнутый круг — с одной стороны, Вы ориентируетесь на современные компьютеры, с другой — Вам нужно нечто вроде машины Тьюринга с бесконечной памятью, чтобы Ваш анализатор мог нормально работать.


Нет, мне бесконечная память не нужна. Память нужна большего размера чем анализируемая программа.

Например анализируемая программа использует N бит данных и состоит из C строк кода.
Анализатору надо в этом случае O((2^N)*C) бит памяти (в худшем случае).

Поэтому Анализатор не может анализировать сам себя.
Третий Рим должен пасть!
Re[16]: Реализован простейший язык для тестирования на заци
От: Cyberax Марс  
Дата: 02.03.09 10:35
Оценка:
Здравствуйте, FR, Вы писали:

К>>Расскажи.

FR>Квантовые вычисления мощнее так как позволяют в общем случае проводить вычисления которые
FR>невозможны в машине Тьюринга, за подробностями гугли Пенроуза.
Ррррр!!!!! Почему всегда Пенроуза цитируют вместе с упоминанием чуши?

Квантовые компьютеры равномощны вероятностной машине Тьюринга, которая равномощна обычной машине Тьюринга. Квантовые компьютеры лишь обладают свойством параллелизма — они могут выполнять некоторые вычисления намного быстрее классической МТ.
Sapienti sat!
Re[18]: Реализован простейший язык для тестирования на заци
От: Cyberax Марс  
Дата: 02.03.09 10:36
Оценка:
Здравствуйте, FR, Вы писали:

К>>Плюс я не уверен, что принципы TFP не применимы к квантовым вычислениям (хотя зарекаться не буду, т.к. не очень в них разбираюсь)

FR>Насколько я понимаю никто пока ни доказал что квантовые вычисления эквивалентны машине Тьюринга, обратное тоже не доказано.
"Квантовые вычисления" вообще — это расплывчатое понятие.

Все существующие и планируемые системы квантовых компьютеров — равномощны МТ и могут быть симулированы на обычном компьютере.
Sapienti sat!
Re[13]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 10:48
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Например анализируемая программа использует N бит данных и состоит из C строк кода.

GC>Анализатору надо в этом случае O((2^N)*C) бит памяти (в худшем случае).

Легко написать однострочную программу которая использует комбинаторно растущую память:
inline int fib(int n)
{
       return n<2 ? 1 : fib(n-1)+fib(n-2);
}
Re[19]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 10:52
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Все существующие и планируемые системы квантовых компьютеров — равномощны МТ и могут быть симулированы на обычном компьютере.


Мне казалось что нет, наверно склероз подвел, или воздейcтвие Пенроуза

А вообще для практики не нужен квантовый компьютре достаточно аппаратной недетерминированной машины Тьюринга, вообще хватает вызова всего одной функции, любимой схемерами функции Amb
Re[3]: Текст программы обнаружения зависаний опубликован
От: GhostCoders Россия  
Дата: 02.03.09 10:52
Оценка:
Здравствуйте, Voblin, Вы писали:

V>Здравствуйте, GhostCoders, Вы писали:


GC>> Хочется сказать, что многие программисты, изучая в институте машину Тьюринга,

GC>> конечно слышили о проблеме неразрешимости, так же как и о "вечном двигателе" и попытках создать его.
GC>> Но есть одно НО, машина Тьюринга бесконечна, для конечных машин, проблема зависания все же
GC>> РАЗРЕШИМА, хотя бы в теории. Про это обычно забывают, и в английской вики про это пишут,
GC>> что это распространенное заблуждение, что неразрешимость проблемы машины Тьюринга переносят
GC>> на конечные компьютеры. http://en.wikipedia.org/wiki/Halting_problem — сомтрите "Common pitfalls".

V>Не знаю, что там где пишут, но если посмотреть на доказательство теоремы про неразрешимость проблемы останова, то там про бесконечность машины ничего не сказано. Просто оказывается не очень сложно сконструировать такие исходные данные для "универсального решателя проблемы останова", при которых и ответ "да", и ответ "нет" оказываются неправильными. Типа парадокса брадобрея.


Это меня и настрораживает. Мне кажется, что парадокс брадобрея можно применить и к другим объектам, да к чем угодно!
Замените, свого "алгоритм" в доказательстве Тьюринга любым другими словом и понятием и получается, что мы прийдем к такому же результату!
Третий Рим должен пасть!
Re[14]: Реализован простейший язык для тестирования на заци
От: GhostCoders Россия  
Дата: 02.03.09 11:00
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, GhostCoders, Вы писали:


GC>>Например анализируемая программа использует N бит данных и состоит из C строк кода.

GC>>Анализатору надо в этом случае O((2^N)*C) бит памяти (в худшем случае).

FR>Легко написать однострочную программу которая использует комбинаторно растущую память:

FR>
FR>inline int fib(int n)
FR>{
FR>       return n<2 ? 1 : fib(n-1)+fib(n-2);
FR>}
FR>


во первых программа не однострочная, есть условный оператор и две ветки к нему

во вторых есть рекурсия, а где есть рекурсия есть и стек, и указатель стека.
стек частно бывает достаточно большого объема (ну скажем 256KB или даже намного более).
Так что данная программа использует около ~5-10 строк кода (набольшое число, я согласен),
и достаточно большое число памяти, которое мы вынуждены все-равно ограничить. Скажем 256*8*1024 бит данных для
стека.

Поэтому АНАЛИЗАТОР должен иметь O( 2^(256*8*1024)*10 ) бит данных для анализа
Третий Рим должен пасть!
Re[17]: Реализован простейший язык для тестирования на заци
От: Alexey F  
Дата: 02.03.09 11:19
Оценка: 10 (1) :)
Здравствуйте, GhostCoders, Вы писали:

GC>простейшие случаи — это


GC>1. программа зависает с периодом смены состояний не очень большим (ну скажем до миллиарда на наших компьютерах)

GC>2. тратит на выполнение не больше миллиарда шагов

Миллиард? Та она на рекурсии быстрее загнётся или в тех же циклах! Я приводил пример трёх вложенных циклов в которых ещё каждый зависит от второго. Не доживёт "анализатор" до миллиарда шагов, не доживёт! >_< У Вас не будет int8, у Вас будет в реальных условиях int64, double и много-много вложенных вызовов функций/циклов!

Нет, мне бесконечная память не нужна. Память нужна большего размера чем анализируемая программа.

Например анализируемая программа использует N бит данных и состоит из C строк кода.
Анализатору надо в этом случае O((2^N)*C) бит памяти (в худшем случае).

Поэтому Анализатор не может анализировать сам себя.


>_<:
for ( int64_t i = 0; i < x; ++i ) {
    for ( int64_t j = 0; j < i; ++j ) {
        for ( int64_t k = 0; k < j; ++k ) {
            printf ( ... );
        }
    }
}

(что-то мне подсказывает, что O((2^N)*C) неверна, но проверять уже не буду).

Программа (не считая printf) использует N = 64 * 3 == 192 бит памяти, состоит из, скажем, 4 строк кода. Немного, правда?

Считаем по формуле: ((2 в степени 192 (ой!)) * 4) бита памяти. 2 в 192 это 6.2771017353866808e+057, вроде бы 6277101735386680763835789423207666416102355444464034512896 бит памяти. Умножаем на 4. Получаем 2,5108406941546723055343157692831e+58 или 25108406941546723055343157692830665664409421777856138051584 бит памяти. Делим на CHAR_BIT на платформе x86 (8), получаем:
3,1385508676933403819178947116038e+57 или 3138550867693340381917894711603833208051177722232017256448 байт памяти. Если я нигде не ошибся, то это 2,9230032746618058364073696654318e+48 или 2923003274661805836407369665432566039311865085952 гигобайт памяти. Для Вас это небольшое число? Если да, подарите мне HDD или флешку с таким объёмом памяти
Четыре строки, всего 192 бита памяти! А уже нереальный, не бесконечный, но стремящийся к бесконечности объём памяти в худшем случае.
Более реалистичный пример:
for ( int i = 0; i < x; ++i ) {
    printf ( "%d", i );
}

((2 ^ 32) * 2 ) == 4294967296 * 2 == 8589934592 бит памяти или 1073741824 байт памяти или 1 гигобайта памяти. 1 гигобайт для простого цикла? А т.к. Вы проверяете перебором всех вариантов, то худший случай всё равно будет.
Re[17]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 02.03.09 11:19
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

>>> однако каков будет по твоему критерий останова?

.>>А у тебя какой?
GC>Если мы перешли в предыдущее состояние, в котором раньше уже были — то значить зависли.
Примитивно. Вот скажем возьмём простейшую функцию:
int64 fibonnachi(int64 n)
{
  return n==0||n==1 ? 1 : fibonnachi(n-2) + fibonnachi(n-1);
}

проанализируй её своим анализатором.

>>> например наш алгоритм выполняется, выполняется.... как определить что он

>>> завис?
.>>Ограничить максимальное количество шагов.
GC>В твоем случае ты всегда будешь дожидаться этого максимального числа шагов, чтобы определить зависание алгоритма.
GC>В моем это возможно намного раньше.
Неочевидно. Ведь он у тебя будет памяти жрать немеряно, а жрать память — тоже время нужно. Засвопит у тебя всё.
Ну ладно, даже допустим ты создал оптимизированный brute force, который в некоторых случаях работает быстрее решения в лоб. И что?

GC>Плюс если алгоритм долго выполняется это не значить что он завис. Если же он перешел в одно из предыдуших состояний,

GC>100% что он завис.
Те алгоритмы которые преходят в "предыдущее состояние" обычно настолько тривиальны, что это сразу видно.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[15]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 11:31
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Поэтому АНАЛИЗАТОР должен иметь O( 2^(256*8*1024)*10 ) бит данных для анализа


Это называется приплыли.
Re[26]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 02.03.09 11:33
Оценка:
Здравствуйте, ., Вы писали:

>> Т.е. ты говоришь, что есть формулы, которые записываются не языком, а

>> чем-то ещё?
>> Приведи пример.
.>Нет, проблема в том, что ты не можешь создать 1 такой язык, который будет описывать все возможные формулы.
Прикольный момент в том, что для любого не более чем счётного подмножества действительных чисел можно придумать формальный язык (тебя наверное это и ввело в заблуждение), их даже можно объединять кучами (опять же счётными), но всё сразу объеденить невозможно, оставшись в рамках "finite strings of letters".
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Текст программы обнаружения зависаний опубликован
От: GhostCoders Россия  
Дата: 02.03.09 11:37
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, Voblin, Вы писали:


V>>Здравствуйте, GhostCoders, Вы писали:


GC>>> Хочется сказать, что многие программисты, изучая в институте машину Тьюринга,

GC>>> конечно слышили о проблеме неразрешимости, так же как и о "вечном двигателе" и попытках создать его.
GC>>> Но есть одно НО, машина Тьюринга бесконечна, для конечных машин, проблема зависания все же
GC>>> РАЗРЕШИМА, хотя бы в теории. Про это обычно забывают, и в английской вики про это пишут,
GC>>> что это распространенное заблуждение, что неразрешимость проблемы машины Тьюринга переносят
GC>>> на конечные компьютеры. http://en.wikipedia.org/wiki/Halting_problem — сомтрите "Common pitfalls".

V>>Не знаю, что там где пишут, но если посмотреть на доказательство теоремы про неразрешимость проблемы останова, то там про бесконечность машины ничего не сказано. Просто оказывается не очень сложно сконструировать такие исходные данные для "универсального решателя проблемы останова", при которых и ответ "да", и ответ "нет" оказываются неправильными. Типа парадокса брадобрея.


GC>Это меня и настрораживает. Мне кажется, что парадокс брадобрея можно применить и к другим объектам, да к чем угодно!

GC>Замените, свого "алгоритм" в доказательстве Тьюринга любым другими словом и понятием и получается, что мы прийдем к такому же результату!

получается что Алан Тьюринг доказал что брадобреев в природе не сущсетвует.

попустим, ты скажешь, "обязуюсь брить тех и только тех кто не бреет сам себя"...
так тебя значить в природе не может быть по теории Тьюринга!!! Ты оказываешься пустое место! Тебе нема!
Третий Рим должен пасть!
Re[15]: Реализован простейший язык для тестирования на заци
От: Alexey F  
Дата: 02.03.09 11:37
Оценка: :)
Здравствуйте, GhostCoders, Вы писали:

GC>Поэтому АНАЛИЗАТОР должен иметь O( 2^(256*8*1024)*10 ) бит данных для анализа


В какой-какой степени 2?
256 * 8 * 1024 == 2097152! Знаете, что pow из Python думает об этом? Она думает:

>>> pow ( 2, 2097152 )
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
pow ( 2, 2097152 )
OverflowError: math range error


Даже WinNTL (библиотека для работы с большими числами) достаточно долго (где-то с минуту) думает...
О! Есть результат. Приводить сюда не буду, потому что запись числа занимает 631 306 десятичных цифр!
Это и называют "стремится к бесконечности".
Re[5]: Текст программы обнаружения зависаний опубликован
От: GhostCoders Россия  
Дата: 02.03.09 11:42
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>получается что Алан Тьюринг доказал что брадобреев в природе не сущсетвует.


GC>попустим, ты скажешь, "обязуюсь брить тех и только тех кто не бреет сам себя"...

GC>так тебя значить в природе не может быть по теории Тьюринга!!! Ты оказываешься пустое место! Тебе нема!

Скажем я заявлю подобное: "обязуюсь брить тех и только тех кто не бреет сам себя"

С точки доказательства Тьюринга меня в природе не может быть... но я есть и пишу сообщения в этом форум
Третий Рим должен пасть!
Re[5]: Текст программы обнаружения зависаний опубликован
От: Cyberax Марс  
Дата: 02.03.09 11:48
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>попустим, ты скажешь, "обязуюсь брить тех и только тех кто не бреет сам себя"...

GC>так тебя значить в природе не может быть по теории Тьюринга!!! Ты оказываешься пустое место! Тебе нема!
Товарищ ".", у тебя там нет под рукой учебника проф. Непейводы, чтобы оттуда привести цитату про философские выводы из теоремы Геделя о неполноте?
Sapienti sat!
Re[4]: Текст программы обнаружения зависаний опубликован
От: Cyberax Марс  
Дата: 02.03.09 11:52
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

GC>Это меня и настрораживает. Мне кажется, что парадокс брадобрея можно применить и к другим объектам, да к чем угодно!

Называется это "парадокс Рассела" и это всего-навсего показывает, что наивная теория множеств — противоречива.

GC>Замените, свого "алгоритм" в доказательстве Тьюринга любым другими словом и понятием и получается, что мы прийдем к такому же результату!

Нет.
Sapienti sat!
Re[20]: Реализован простейший язык для тестирования на заци
От: Cyberax Марс  
Дата: 02.03.09 11:53
Оценка:
Здравствуйте, FR, Вы писали:

C>>Все существующие и планируемые системы квантовых компьютеров — равномощны МТ и могут быть симулированы на обычном компьютере.

FR>Мне казалось что нет, наверно склероз подвел, или воздейcтвие Пенроуза
Вообще-то, да.

FR>А вообще для практики не нужен квантовый компьютре достаточно аппаратной недетерминированной машины Тьюринга, вообще хватает вызова всего одной функции, любимой схемерами функции Amb

На практике квантовые компьютеры позволяют уменьшить класс сложности для многих задач.
Sapienti sat!
Re[21]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 02.03.09 12:03
Оценка:
Здравствуйте, Cyberax, Вы писали:

FR>>А вообще для практики не нужен квантовый компьютре достаточно аппаратной недетерминированной машины Тьюринга, вообще хватает вызова всего одной функции, любимой схемерами функции Amb

C>На практике квантовые компьютеры позволяют уменьшить класс сложности для многих задач.

Так Amb тоже сводит NP-полные алгоритмы к полиномиальным.
Re[4]: Текст программы обнаружения зависаний опубликован
От: Voblin Россия http://maslyaew.narod.ru/
Дата: 02.03.09 12:03
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Это меня и настрораживает. Мне кажется, что парадокс брадобрея можно применить и к другим объектам, да к чем угодно!

Например?

GC>Замените, свого "алгоритм" в доказательстве Тьюринга любым другими словом и понятием и получается, что мы прийдем к такому же результату!

Тем не менее, доказательство получается вполне строгим. Но это не должно тебя шокировать. Задачки с ответами "ни да, ни нет" и "и да, и нет" — довольно экзотическая штука, и от них всегда попахивает некоторой искусственностью и надуманностью.
Re[5]: Текст программы обнаружения зависаний опубликован
От: GhostCoders Россия  
Дата: 02.03.09 12:07
Оценка:
Здравствуйте, Voblin, Вы писали:

V>Здравствуйте, GhostCoders, Вы писали:


GC>>Это меня и настрораживает. Мне кажется, что парадокс брадобрея можно применить и к другим объектам, да к чем угодно!

V>Например?

GC>>Замените, свого "алгоритм" в доказательстве Тьюринга любым другими словом и понятием и получается, что мы прийдем к такому же результату!

V>Тем не менее, доказательство получается вполне строгим. Но это не должно тебя шокировать. Задачки с ответами "ни да, ни нет" и "и да, и нет" — довольно экзотическая штука, и от них всегда попахивает некоторой искусственностью и надуманностью.

Не знаю. Заменим в суждениях Тьюринга слово "машина Тьюринга" понятием обычная легковая машина.
Выполнять алгоритм — "ездить".

Получается что не сущвествует легковой машины, которая могла бы возить лругие легковые машины???
Третий Рим должен пасть!
Re: Реализован простейший язык для тестирования на зациклив
От: mrTwister Россия  
Дата: 02.03.09 12:08
Оценка: 1 (1) +1 :))
Здравствуйте, GhostCoders, Вы писали:

Таким подходом можно решить задачу века: заставить компьютер писать программы вместо человека. Для этого всего лишь надо перебирать последовательности байт, рано или поздно мы гарантированно получим программу, которая делает то, что нам нужно.
лэт ми спик фром май харт
Re[2]: Реализован простейший язык для тестирования на зацик
От: Alexey F  
Дата: 02.03.09 12:12
Оценка: :)
Здравствуйте, mrTwister, Вы писали:

T>Таким подходом можно решить задачу века: заставить компьютер писать программы вместо человека. Для этого всего лишь надо перебирать последовательности байт, рано или поздно мы гарантированно получим программу, которая делает то, что нам нужно.


Да что там века!
Все помнят, что бесконечное количество обезьян за пишущими машинками когда-нибудь повторят "Гамлета" ?
Тогда и писатели будут не нужны
Re[6]: Текст программы обнаружения зависаний опубликован
От: Cyberax Марс  
Дата: 02.03.09 13:11
Оценка: +1 :)
Здравствуйте, GhostCoders, Вы писали:

GC>Не знаю. Заменим в суждениях Тьюринга слово "машина Тьюринга" понятием обычная легковая машина.

GC>Выполнять алгоритм — "ездить".
Заменим слово "алгоритм" на "берёза", а "машина Тьюринга" на "Луна".

"Получается, что не существует берёзы, которая могла бы определить останавливается ли Луна".
Sapienti sat!
Re[7]: Текст программы обнаружения зависаний опубликован
От: GhostCoders Россия  
Дата: 02.03.09 13:23
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, GhostCoders, Вы писали:


GC>>Не знаю. Заменим в суждениях Тьюринга слово "машина Тьюринга" понятием обычная легковая машина.

GC>>Выполнять алгоритм — "ездить".
C>Заменим слово "алгоритм" на "берёза", а "машина Тьюринга" на "Луна".

C>"Получается, что не существует берёзы, которая могла бы определить останавливается ли Луна".

ну вот я тоже к этому пришел.
Третий Рим должен пасть!
Re[8]: Текст программы обнаружения зависаний опубликован
От: Cyberax Марс  
Дата: 02.03.09 13:56
Оценка: +1
Здравствуйте, GhostCoders, Вы писали:

C>>Заменим слово "алгоритм" на "берёза", а "машина Тьюринга" на "Луна".

C>>"Получается, что не существует берёзы, которая могла бы определить останавливается ли Луна".
GC>ну вот я тоже к этому пришел.
Стоит понимать, что математические выражения являются верными не потому, что "звучат" правильно, а потому, что они выводятся из изначальных аксиом в данной теории.

Т.е. имеем аксиомы:
1. Рыбы летают.
2. Полосатые рыбы опыляют цветы.
3. Есть хотя бы одна полосатая рыба.
В этой теории у нас будет верно выражение: "Есть рыбы, опыляющие цветы". Хотя звучит оно как полный бред.

В общем, рекомендую почитать учебник по мат. логике.
Sapienti sat!
Re[5]: Реализован простейший язык для тестирования на зацик
От: C0x  
Дата: 02.03.09 13:57
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, GhostCoders, Вы писали:


GC>>>Здравствуйте, D. Mon, Вы писали:


DM>>>>Здравствуйте, GhostCoders, Вы писали:


GC>>>>>Реализовал транслятор простейшего языка программирования.


DM>>>>Очень хорошо. Теперь нужно перевести на этот язык вот эту простейшую функцию:

DM>>>>http://rsdn.ru/forum/Default.aspx?mid=3307978
Автор: RomikT
Дата: 27.02.09

DM>>>>и узнать, наконец-то ответ!

GC>>>Вот пример данной функции на этом языке:


GC>>>* This is function from RomikT *


GC>>>PROGRAM RomikT

GC>>>INPUT n TYPE int8

А>>Как бы так помягче выразиться.. С какого перепугу N тут int8? "Анализатор" тупо перебирает все возможные значения входных параметров??


GC>А почему бы и нет?


Потомучто видимо это может длиться несколько лет в некоторых случаях.
Re[6]: Реализован простейший язык для тестирования на зацик
От: FR  
Дата: 02.03.09 14:32
Оценка:
Здравствуйте, C0x, Вы писали:

GC>>А почему бы и нет?


C0x>Потомучто видимо это может длиться несколько лет в некоторых случаях.


Угу солнце как раз к этому времени перейдет в стадию красного гиганта
Re[7]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 02.03.09 14:43
Оценка:
Здравствуйте, FR, Вы писали:

C0x>>Потомучто видимо это может длиться несколько лет в некоторых случаях.

FR>Угу солнце как раз к этому времени перейдет в стадию красного гиганта
Шнайер оценивал, что для идеального компьютера потребуется примерно энергия взрыва сверхновой, чтобы перебрать 2^220 бит. Так что просто энергии вряд ли хватит
Sapienti sat!
Re[8]: Реализован простейший язык для тестирования на зацик
От: FR  
Дата: 02.03.09 14:55
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Шнайер оценивал, что для идеального компьютера потребуется примерно энергия взрыва сверхновой, чтобы перебрать 2^220 бит. Так что просто энергии вряд ли хватит


Фейнман вроде доказал что обратимые вычисления возможны без затрат энергии вообще. Правда кажется что такие вычислители не Тьюринг-полные.
Re[9]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 02.03.09 15:44
Оценка:
Здравствуйте, FR, Вы писали:

C>>Шнайер оценивал, что для идеального компьютера потребуется примерно энергия взрыва сверхновой, чтобы перебрать 2^220 бит. Так что просто энергии вряд ли хватит

FR>Фейнман вроде доказал что обратимые вычисления возможны без затрат энергии вообще.
Да. Причём квантовые вычисления могут быть ТОЛЬКО обратимыми.

FR>Правда кажется что такие вычислители не Тьюринг-полные.

Они Тьюринг-полные (любая МТ тривиально делается реверсирумой). Проблема в том, что для части алгоритмов требуется непрактично большой объём хранилища.
Sapienti sat!
Re[6]: Текст программы обнаружения зависаний опубликован
От: Voblin Россия http://maslyaew.narod.ru/
Дата: 02.03.09 16:06
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Скажем я заявлю подобное: "обязуюсь брить тех и только тех кто не бреет сам себя"

GC>С точки доказательства Тьюринга меня в природе не может быть... но я есть и пишу сообщения в этом форум

Если бы ты был тем несчастным, который должен в точности выполнить всё, что заявляет, то после этого заявления ты должен был бы убить себя об стену. Впрочем, убивать себя тоже нельзя т.к. при этом не выполнишь обязательство брить тех, кто не бреет себя сам.
Re[3]: Реализован простейший язык для тестирования на зацик
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.03.09 17:51
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, mrTwister, Вы писали:


T>>Таким подходом можно решить задачу века: заставить компьютер писать программы вместо человека. Для этого всего лишь надо перебирать последовательности байт, рано или поздно мы гарантированно получим программу, которая делает то, что нам нужно.


AF>Да что там века!

AF>Все помнят, что бесконечное количество обезьян за пишущими машинками когда-нибудь повторят "Гамлета" ?
AF>Тогда и писатели будут не нужны

Вроде же в оригинале было более "партриотичное" произведение "Война и Мир"?
Re[4]: Реализован простейший язык для тестирования на зацик
От: Alexey F  
Дата: 02.03.09 18:07
Оценка: 1 (1)
Здравствуйте, Курилка, Вы писали:

К>Вроде же в оригинале было более "партриотичное" произведение "Война и Мир"?


Ой. Я ориентировался на другой источник :

-- Артур, это фантастика! Нас подцепил корабль с Бесконечно
Невероятностным Полетом! Этого не может быть! Слухи о нем давно ходили!
Официально их опровергали, но, значит, они все-таки построили его! Они
изобрели Невероятностный Полет! Артур, ведь это... Артур! Что происходит?
Артур прижался к двери, пытаясь закрыть ее, но она была плохо
подогнана. Оставались широкие щели, и сквозь них просовывались маленькие
мохнатые ручки с пятнами краски на пальцах; слышались пискливые безумные
голоса.
Артур взглянул на Форда.
-- Форд! -- выговорил он, -- там, снаружи, бесконечно много обезьян. И
они хотят обсудить с нами "Гамлета", который у них получился.

(c) Дуглас Адамс. Путеводитель хитч-хайкера по Галактике

Re[5]: Реализован простейший язык для тестирования на зацик
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.03.09 18:15
Оценка:
Здравствуйте, Alexey F, Вы писали:

[cut]

AF>(c) Дуглас Адамс. Путеводитель хитч-хайкера по Галактике


О, у Адамса как-то не заметил этого, спасибо.
А кто автор "фишки" про миллион мартышек и "Войну и мир" как-то не нагугливается
Так что у тебя аргументированней выходит
Re[6]: Реализован простейший язык для тестирования на зацик
От: Alexey F  
Дата: 02.03.09 18:40
Оценка:
Здравствуйте, Курилка, Вы писали:

К>О, у Адамса как-то не заметил этого, спасибо.

К>А кто автор "фишки" про миллион мартышек и "Войну и мир" как-то не нагугливается
К>Так что у тебя аргументированней выходит

Я слышал раньше, но не про "Войну и мир", а вообще про то что множество мартышек могут повторить любое литературное произведение, а потом нашёл про "Гамлета" у Дугласа
Re[5]: Реализован простейший язык для тестирования на зацик
От: Cyberax Марс  
Дата: 02.03.09 18:48
Оценка: 5 (2)
Здравствуйте, Alexey F, Вы писали:

К>>Вроде же в оригинале было более "партриотичное" произведение "Война и Мир"?

AF>Ой. Я ориентировался на другой источник :
Этой шутке намного больше лет: http://en.wikipedia.org/wiki/Infinite_monkeys#History
Sapienti sat!
Re[15]: Реализован простейший язык для тестирования на заци
От: . Великобритания  
Дата: 02.03.09 22:15
Оценка:
GhostCoders wrote:

> FR>inline int fib(int n)

> FR> return n<2 ? 1 : fib(n-1)+fib(n-2);

> во вторых есть рекурсия, а где есть рекурсия есть и стек, и указатель стека.

> стек частно бывает достаточно большого объема (ну скажем 256KB или даже
Вообще-то здесь стек не будет глубоким. Примерно столько же, сколько значение n. Т.е. для данной функции байт 200 хватит, чтобы работать несколько лет.

> Поэтому АНАЛИЗАТОР должен иметь O( 2^(256*8*1024)*10 ) бит данных для

> анализа
Губа не дура.

В общем доучись до третьего курса, а потом приходи мир переворачивать.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Текст программы обнаружения зависаний опубликован
От: . Великобритания  
Дата: 02.03.09 22:32
Оценка:
Cyberax wrote:

> GC>так тебя значить в природе не может быть по теории Тьюринга!!! Ты

> оказываешься пустое место! Тебе нема!
> Товарищ ".", у тебя там нет под рукой учебника проф. Непейводы, чтобы
> оттуда привести цитату про философские выводы из теоремы Геделя о неполноте?
Книжка вроде доступна публично тут http://ulm.uni.udm.ru/~nnn/prilog.pdf
А так там § 13.5, но читать с наскоку тяжело, формулы всякие, теоремы...
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[16]: Реализован простейший язык для тестирования на заци
От: FR  
Дата: 03.03.09 03:31
Оценка:
Здравствуйте, ., Вы писали:

>> во вторых есть рекурсия, а где есть рекурсия есть и стек, и указатель стека.

>> стек частно бывает достаточно большого объема (ну скажем 256KB или даже
.>Вообще-то здесь стек не будет глубоким. Примерно столько же, сколько значение n. Т.е. для данной функции байт 200 хватит, чтобы работать несколько лет.

По моему чуть глубже, но неважно, на самом деле будет вполне ограниченно, зато дерево вызовов будет страшно развесистым и проходов по нему будет очень много, а его необходимо сохранять, так что уже для n > 30 думаю нереально анализировать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.