LINUX.ORG.RU

как статически доказать эквивалентость двух произвольных алгоритмов

 


2

2

Под эквивалентностью я подразумеваю равенство выходных данных и произведенных побочных эффектов

Например, для двух функций вычислений n-го числа фибоначчи (питон)


def fib1(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

def fib2(n):
    if n < 2:
        return n
    return fib2(n-1) + fib2(n-2)

как доказать что соотношения множеств входных и выходных данных для этих функций одинаковы (не учитывая переполнение стека для второй) ?

Питон тут для примера, для какого-нибудь лиспа, наверное, проще будет сделать это


Ответ на: комментарий от emulek

Да и вообще, не только ограничение размера кода, любое ограничение класса алгоритмов, которым дается оценка, допускает существование анализатора, лишь бы он, а точнее, код [if F(A, A): sleep()] выходил за пределы этого класса.

По крайней мере, доказательство теоремы это допускает.

kaathewise
()
Ответ на: комментарий от emulek

пруф можно?

коненчо, можно. Почитай определение МТ.

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

Ты на вопрос ответь. Как узнать по программе количество памяти.

anonymous
()
Ответ на: комментарий от emulek

«других» IRL не бывает.

Конечно же бывает.

Вроде того, что я тут высказался: «short всегда не длиннее 4х байтов». Откуда я это вывел? Просто знаю, и всё. А в марсианском может и 5.

Конечно же не может.

anonymous
()
Ответ на: комментарий от emulek

«переход» куда?

Предельный переход. Ты не в курсе, что это такое?

Чем тебе плохо в «сколь угодно больших»?

Ты тупой? Еще раз - в математике «бесконечно большое» и «сколь угодно большое» это _одно и то же_. ПО ОПРЕДЕЛЕНИЮ.

Не «сколько угодно», а «больше любого заранее выбранного числа».

«больше любого» и «сколь угодно большое» - это, очевидно, одно и то же.

anonymous
()
Ответ на: комментарий от emulek

потому что нет смысла обсуждать то, чего нет.

Никто и не обсуждает. Никаких бесконечностей в МТ нет, в доказательствах бесконечности не фигурируют.

anonymous
()
Ответ на: комментарий от anonymous

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

никак. Только не нужно опять путать «никак» и «бесконечно много». Это разные вещи.

emulek
()
Ответ на: комментарий от emulek

Только не нужно опять путать «никак» и «бесконечно много». Это разные вещи.

Почему же? Как раз одинаковые.

anonymous
()
Ответ на: комментарий от anonymous

Ты тупой? Еще раз - в математике «бесконечно большое» и «сколь угодно большое» это _одно и то же_. ПО ОПРЕДЕЛЕНИЮ.

успокойся. Почитай учебник, попей валерьянки. Начни с вики: http://ru.wikipedia.org/wiki/Бесконечность Не всё так просто, как оно тебе кажется.

На самом деле, в математике ∞ числом НЕ является. Определяется оно в два приёма:

1. берётся любое число M (сколь угодно большое)

2. ВНЕЗАПНО оказывается, что ∞ > M

Ты можешь заметить тот любопытный факт, что M это как раз твоя «бесконечность»(бесконечно большое число), но математическая ∞ всегда больше любого числа M. Мало того, если M+1=M1, то M!=M1, и каким бы не было число, для нрего это верно. Нет самого большого числа. Для ∞ это правило не выполняется. Бесконечность не больше, не равна и не меньше ∞, причём одновременно. Точнее, все три этих высказывания одновременно являются им истинными и ложными. Да, все восемь комбинаций. Это также верно как и то, что 0/0 имеет «значение»: «все числа». Это прямо следует из тождества 0*"все числа"==0.

Тут нет никакой магии, а есть только неопределённость: т.к. ∞ не является числом, то и свойства чисел для неё не выполняются. Они просто нее имеют никакого смысла.

«больше любого» и «сколь угодно большое» - это, очевидно, одно и то же.

нет. Если у тебя пиписька «больше чем у любого в классе», то не льсти себе. Она не только не бесконечная, а вообще ещё не выросла.

Число по определению ограничено, и имеет предел. Каким бы не было число, к нему всегда можно прибавить один, и получится другое число, которое больше. Потому число всегда НЕ бесконечное, и всегда _меньше_ ∞.

emulek
()
Ответ на: комментарий от anonymous

Значит, твой алгоритм решения проблемы останова не работает.

не значит. Если я говорю, что 0/0 не имеет смысла, то это не значит, что 0/0=5 ложно. Потому что 0*5=0 таки истинно. Как и 0/0=5.

Мой алгоритм иногда работает, иногда не работает. Высказывание «мой алгоритм не работает» очевидно ложное. Теорема не доказана. И не опровергнута.

Пример из жизни: ты не знаешь, сколько у меня денег в кармане. Это ничего не доказывает. Может у меня есть деньги, может нет. А если есть, то неизвестно сколько.

emulek
()
Ответ на: комментарий от emulek

Мой алгоритм иногда работает, иногда не работает

Можно уточнить, о каком алгоритме речь? «иногда не работает» вроде бы то же самое, что «не работает в общем случае».

anonymous
()
Ответ на: комментарий от anonymous

Значит, твой алгоритм решения проблемы останова не работает.

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

monk ★★★★★
()
Ответ на: комментарий от anonymous

Можно уточнить, о каком алгоритме речь?

не имеет значения.

«иногда не работает» вроде бы то же самое, что «не работает в общем случае».

нет. Например высказывание «натуральное число нечётное в общем случае» ложно. Т.к. есть чётные.

emulek
()
Ответ на: комментарий от monk

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

даже если это и не так, то всегда можно выделить наибольший цикл. Т.е. имеется состояние Kn, эквивалентное состоянию Km. Это и нужно считать концом. Например вот такой алгоритм: 1,2,3,4,5,6,7,8,5,6,7,8,5,6,7,8,5... очевидно конечен, т.к. конечен цикл 5,6,7,8. Бесконечность последовательности не имеет значения, ибо «конечный» алгоритм который кончается 8, на самом деле тоже бесконечный, 8,8,8,8,8,8...

emulek
()
Ответ на: комментарий от monk

Потому что ограничено время жизни того компьютера, на котором она запущена.

Откуда ты знаешь, на каком компьютере она запущена?

anonymous
()
Ответ на: комментарий от emulek

Если я говорю, что 0/0 не имеет смысла, то это не значит, что 0/0=5 ложно.

Именно это и значит.

Мой алгоритм иногда работает, иногда не работает.

Если алгоритм ИНОГДА не работает, то он в принципе не работает. Так уж принято считать. А придумать алгоритмы решения задачи останова, которые работают ИНОГДА - да нету никаких проблем. Например, можно просто всегда выводить «останавливается». И этот алгоритм будет работать всегда, когда программа останавливается, представь себе.

anonymous
()
Ответ на: комментарий от emulek

Начни с вики: http://ru.wikipedia.org/wiki/Бесконечность

А ты не читай вики. Почитай любой учебник по матану и на тебя ниспадет просветление.

На самом деле, в математике ∞ числом НЕ является.

Именно так. Оно является последовательностью.

Определяется оно в два приёма:

Нет, оно определяется не так. Берется последовательность x_n: Natural -> Natural, такая, что forall M:Natural exists N:Natural : x_N > M. Эта последовательность называется «бесконечно большой», это обозначается как lim_(n->+inf)x_n = +inf

При этом запись _цельная_, знак равенства в ней не является знаком равенства (в том смысле что эта запись не означает, что левая часть хоть в каком-то смысле равна правой части). Просто так принято обозначать бесконечно большие последовательности. Все, больше никаких бесконечностей в математике нет.

но математическая ∞ всегда больше любого числа M.

Сравнивать можно только числа. Бесконечность - не число, по-этому его нельзя сравнивать с числами. Соответственно, бесконечность не больше любого числа. Она вообще не больше и не меньше чего бы то ни было.

Точнее, все три этих высказывания одновременно являются им истинными и ложными.

Если хотя бы одно из них верно вместе с отрицанием, то теория противоречива. Чего мы не наблюдаем на практике. То есть ты несешь ересь.

Это также верно как и то, что 0/0 имеет «значение»: «все числа».

но это не верно. x/0 не имеет никаких значений.

Это прямо следует из тождества 0*«все числа»==0.

Нет, не следует. Это совершенно несвязанные тождества.

нет. Если у тебя пиписька «больше чем у любого в классе»

А при чем тут «в классе» если она «больше любой другой пиписьки»? Не в классе, а вообще.

anonymous
()
Ответ на: комментарий от anonymous

x_n: Natural -> Natural, такая, что forall M:Natural exists N:Natural : forall N' > N : x_N' > M

anonymous
()
Ответ на: комментарий от anonymous

на каком компьютере она запущена?

IRL не существует компьютеров, работающих _бесконечное_ время. Даже потенциально (через 10^39 лет Вселенная распадётся вместе со всеми компьютерами).

monk ★★★★★
()
Ответ на: комментарий от anonymous

Откуда ты знаешь, на каком компьютере она запущена?

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

emulek
()
Ответ на: комментарий от anonymous

С чего ты взял?

с того факта, что если память в N битов, то всего существует 2**N состояний. И если машина детерминирована, то не более чем за 2**N тактов машина придёт к тому состоянию, которое уже было. И всё опять повториться. Для этого необходимо и достаточно того, что N — любое натуральное число.

emulek
()
Ответ на: комментарий от anonymous

Если я говорю, что 0/0 не имеет смысла, то это не значит, что 0/0=5 ложно.

Именно это и значит.

но 5*0=0 истинно.

Если алгоритм ИНОГДА не работает, то он в принципе не работает.

вот как раз В ПРИНЦИПЕ он работает. Просто существуют «плохие» условия.

Так уж принято считать.

ты пруф забыл.

А придумать алгоритмы решения задачи останова, которые работают ИНОГДА - да нету никаких проблем. Например, можно просто всегда выводить «останавливается». И этот алгоритм будет работать всегда, когда программа останавливается, представь себе.

да, можно и так. Также программа будет останавливаться если имеет N бит памяти, где N любое натуральное число. Или переходить в цикл, размер которого не более 2**N, и который всегда повторяется.

emulek
()
Ответ на: комментарий от anonymous

А ты не читай вики. Почитай любой учебник по матану и на тебя ниспадет просветление.

тут надо читать скорее про теорию множеств. В анализе понятие «бесконечность» имеет несколько иной смысл обычно. Более упрощённый. В матане просто нет никакой нужды формализовывать бесконечность достаточно строго.

Именно так. Оно является последовательностью.

не так. Оно является абстракцией.

Эта последовательность называется «бесконечно большой»

да, число эл-тов последовательности бесконечно большое, при этом сами элементы вполне конечные.

О чём я и говорю.

Все, больше никаких бесконечностей в математике нет.

просто ты никаких других не знаешь.

Сравнивать можно только числа. Бесконечность - не число, по-этому его нельзя сравнивать с числами.

можно. По определению бесконечность больше любого числа.

Если хотя бы одно из них верно вместе с отрицанием, то теория противоречива.

да.

Чего мы не наблюдаем на практике.

не наблюдаем.

То есть ты несешь ересь.

ты тоже. IRL бесконечности не существует.

но это не верно. x/0 не имеет никаких значений.

x/0 не имеет смысла само по себе, если x!=0. Если x==0, то 0/0 имеет смысла, не имеет смысла только значение 0/0.

Это прямо следует из тождества 0*«все числа»==0.

Нет, не следует. Это совершенно несвязанные тождества.

нет, следует, если деление это по определению обратная к умножению операция.

А при чем тут «в классе» если она «больше любой другой пиписьки»? Не в классе, а вообще.

а «вообще» ты не можешь проверить. Даже в теории.

emulek
()
Ответ на: комментарий от emulek

Просто были слова «твой» «мой» как будто говорили о каком-то конкретном алгоритме. Его нет?

нет. Например высказывание «натуральное число не нечётное в общем случае» истинно. Т.к. есть чётные.

quickfix

anonymous
()
Ответ на: комментарий от anonymous

Просто были слова «твой» «мой» как будто говорили о каком-то конкретном алгоритме. Его нет?

программа будет останавливаться если имеет N бит памяти, где N любое натуральное число. Или переходить в цикл, размер которого не более 2**N, и который всегда повторяется.

quickfix

ещё скажи, что «человек в общем случае не немужчина»...

emulek
()
Ответ на: комментарий от emulek

с того факта, что если память в N битов

А кто тебе сказал, что память N битов? С чего ты взял, что не M?

anonymous
()
Ответ на: комментарий от emulek

но 5*0=0 истинно.

Именно. Но это утверждение не имеет никакого отношения к утверждениям вида n/0=m.

вот как раз В ПРИНЦИПЕ он работает.

Да нет, он В ПРИНЦИПЕ НЕ РАБОТАЕТ. То есть вообще. Если алгоритм работает - он работает всегда и везде. Все остальное - не работает. Так принято считать.

ты пруф забыл.

Пруф чего? Очевидных всем умолчаний? Ну прочитай хоть пару книжек.

да, можно и так.

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

anonymous
()
Ответ на: комментарий от emulek

тут надо читать скорее про теорию множеств.

Да нет, именно про матан. Потому что «бесконечности» появились исключительно в матане. Собственно, математический анализ - это как раз и есть специальная теория-костыль, которая позволяет работать с б/м-б/б величинами.

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

Просто ты не знаешь матана, вот и все. Матан - это теория, которая специально придумана для того, чтобы формализовать понятие бесконечно больших/малых величин. МАКСИМАЛЬНО строго. Собственно, ничего кроме этой формализации в матане больше и нету.

не так. Оно является абстракцией.

Конечно, так. Я привел тебе общеизвестное определение из учебника.

да, число эл-тов последовательности бесконечно большое

Никаких «бесконечно больших чисел» в математике (по крайней мере в рамках стандартного анализа) не существует. Откуда ты берешь всю эту чушь?

просто ты никаких других не знаешь.

Их нет. Просто ты не знаешь математики. Даже самых основных определений. В этом твои проблемы. Воинствующее невежество.

По определению бесконечность больше любого числа.

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

ты тоже. IRL бесконечности не существует.

Ее и в математике не существует.

x/0 не имеет смысла само по себе, если x!=0.

Оно не имеет смысла в любом случае. При чем тут х? По определению деление на 0 - это умножение на элемент, обратный нулю. Как элемент обратен нулю? Нету такого элемента. Значит и деления на ноль не существует. Что бы ты ни пытался делить.

нет, следует, если деление это по определению обратная к умножению операция.

Деление - это, по определению, умножение на обратный элемент. Обратного для нуля - нет. Конец истории. При этом что именно ты попытаешься умножить на этот несуществующий обратный элемент - совершенно не важно. Умножать не на что.

а «вообще» ты не можешь проверить.

А мне и не надо ничего проверять.

anonymous
()
Ответ на: комментарий от emulek

программа будет останавливаться если имеет N бит памяти, где N любое натуральное число.

Кто тебе сказал, что такое N есть? В программе не указано потребление памяти, узнать, на каком компьютере программа будет запущена ты по этой программе не можешь. Откуда ты возьмешь N? С чего ты взял, что N вообще существует?

anonymous
()
Ответ на: комментарий от anonymous

с того факта, что если память в N битов

А кто тебе сказал, что память N битов? С чего ты взял, что не M?

задолбал. Иди яги попей. Ты недопил ещё.

emulek
()
Ответ на: комментарий от anonymous

программа будет останавливаться если имеет N бит памяти, где N любое натуральное число.

Кто тебе сказал, что такое N есть?

я сказал. Учись читать: любое N.

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

Если N не существует, то и компьютера не существует. Задолбал. У тебя яга кончилась что-ли?

emulek
()
Ответ на: комментарий от emulek

программа будет останавливаться если имеет N бит памяти, где N любое натуральное число. Или переходить в цикл, размер которого не более 2**N, и который всегда повторяется.

На алгоритм не тянет как-то. Больше похоже на 2 варианта ответа. Вы об этом с анонимусом говорили?

немужчина

Что за зверь такой? «нечетное» вполне себе кошерный термин, зачем петросянить? Ну ок, «посетитель лора в общем случае не неемулек» потому, что есть емулек, истинно же.

anonymous
()
Ответ на: комментарий от anonymous

программа будет останавливаться если имеет N бит памяти, где N любое натуральное число. Или переходить в цикл, размер которого не более 2**N, и который всегда повторяется.

На алгоритм не тянет как-то.

потому что условия нет. Я так и не дождался определения понятия «остановилось». Вот 1,1,1,1,1,1... Это «остановилось»? А 1,2,1,2,1,2,1...?

немужчина

Что за зверь такой? «нечетное» вполне себе кошерный термин, зачем петросянить?

а что за понятие «не нечётное»? Ведь если заменить его на «чётное», утверждение становится тривиально ложным.

Ну ок, «посетитель лора в общем случае не неемулек» потому, что есть емулек, истинно же.

а я разве не неемулек? Или я в общий случай не вхожу?

emulek
()
Ответ на: комментарий от emulek

Я так и не дождался определения понятия «остановилось»

Конечно, правильнее переадресовать это тому, с кем ты общался. Но

Вот 1,1,1,1,1,1... Это «остановилось»? А 1,2,1,2,1,2,1...?

любая из этих последовательностей без 3х точек в конце.

программа будет останавливаться

А что ты определяешь как «остановилось»?

Ведь если заменить его на «чётное», утверждение становится тривиально ложным.

И если заменить на «нечетное», и «ноль», и «простое». «Число в общем случае не является нечетным», «Алгоритм в общем случае не является рабочим». Опровергай@Буквоедствуй.

а я разве не неемулек? Или я в общий случай не вхожу?

Ты ненеемулек. Ты входишь в общий случай. А общий случай в тебя не входит. Размеры^WМощности разные.

anonymous
()
Ответ на: комментарий от anonymous

в моём процессоре нет команды «стоп». Есть только «подожди...»

А что ты определяешь как «остановилось»?

машина придёт к тому состоянию, которое уже было. И всё опять повториться.

Ты ненеемулек. Ты входишь в общий случай. А общий случай в тебя не входит. Размеры^WМощности разные.

значит вообще нельзя сравнивать меня и всех. Также, как высказывание

«анонимус в общем случае ты» ложно

«анонимус в общем случае не ты» тоже ложно.

emulek
()
Ответ на: комментарий от emulek

я сказал. Учись читать: любое N.

Ты читать не умеешь? Еще раз - с чего ты взял, что такое N есть?

Если N не существует, то и компьютера не существует.

А при чем тут вообще компьютер, если речь о программе? Да, действительно, вполне возможно, что компьютера и не существует. Но программа есть. И она может завершиться. А может - не завершиться.

anonymous
()
Ответ на: комментарий от emulek

докажи.

Это достаточно очевидно. По определению обратный для n - это такой, что n*n^(-1)=1. но n*0=0!=1 для любого n. Следовательно, обратного элемента для нуля не существует.

anonymous
()
Ответ на: комментарий от emulek

машина придёт к тому состоянию, которое уже было. И всё опять повториться.

Ты ведь сейчас не о машине Тьюринга (и эквивалентах) говоришь?

значит вообще нельзя сравнивать меня и всех

Никто и не сравнивал конкретно тебя. Сравнивать можно множество использующих логин емулек на лоре с включающим его множеством заходящих на лор.

«анонимус в общем случае не ты» тоже ложно.

Написал выше, «не является» корректней. Ты намеренно игнорируещь или невнимателен?

anonymous
()
Ответ на: комментарий от anonymous

Ты читать не умеешь? Еще раз - с чего ты взял, что такое N есть?

а может существовать _реальный_ компьютер с нереальным размером памяти? Ты что курил сегодня?

А при чем тут вообще компьютер, если речь о программе?

потому что на программу мне насрать. Я о компьютере. А программа без него не имеет смысла.

emulek
()
Ответ на: комментарий от anonymous

Доказывать должен тот, кто выдвинул утверждение.

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

emulek
()
Ответ на: комментарий от anonymous

По определению обратный для n - это такой, что n*n^(-1)=1

ты невнимателен. У меня другое определение, а именно: деление — функция обратная умножению. Эти определение эквивалентны всегда, кроме случая /0. Ничего страшного, вот 0! ты тоже не вычислишь по обычному определению 1*2*3*... Это никак не означает того, что 0! не существует. Всем известно, что 0!==1.

Следовательно, обратного элемента для нуля не существует.

нет. Следовательно, обратного числа к нулю нет внутри любого конечного подмножества некоторых чисел.

emulek
()
Ответ на: комментарий от anonymous

машина придёт к тому состоянию, которое уже было. И всё опять повториться.

Ты ведь сейчас не о машине Тьюринга (и эквивалентах) говоришь?

конечно нет. Ибо по бесконечной ленте можно бесконечно долго передвигаться. А по конечной — нельзя(кроме циклов конечно). Всегда ваш К.О. ВНЕЗАПНО: кольцо конечно. Хотя и не имеет начала и конца.

Никто и не сравнивал конкретно тебя. Сравнивать можно множество использующих логин емулек на лоре с включающим его множеством заходящих на лор.

если высказывание иногда истинно и иногда ложно, то значит, что оно не является истинным и не является ложным. Истинности такого высказывания просто не существует. Как не существует например символа, на который начинается любой никнейм на ЛОРе.

Написал выше, «не является» корректней. Ты намеренно игнорируещь или невнимателен?

это не имеет значения.

emulek
()
Ответ на: комментарий от emulek

машина придёт к тому состоянию, которое уже было. И всё опять повториться.

Ты ведь сейчас не о машине Тьюринга (и эквивалентах) говоришь?

конечно нет. Ибо по бесконечной ленте можно бесконечно долго передвигаться. А по конечной — нельзя(кроме циклов конечно).

Какой стороной конечность машины относится к возможности останова? Ты говорил, что алгоритма нет потому, что «остановилось» не определено.

Всегда ваш К.О. ВНЕЗАПНО: кольцо конечно. Хотя и не имеет начала и конца.

Это не делает кольцо эквивалентом МТ (конечной или бесконечной).

если высказывание иногда истинно и иногда ложно, то значит, что оно не является истинным и не является ложным. Истинности такого высказывания просто не существует. Как не существует например символа, на который начинается любой никнейм на ЛОРе.

Иди дальше: «иногда» такой символ существует, а «иногда» нет.

это не имеет значения.

Т.е. намеренно игнорируешь?

anonymous
()
Ответ на: комментарий от emulek

У меня другое определение

Никого не ебет что там у тебя. Есть общепринятое определение. Если ты говоришь «деление», то подразумеваешь умножение на обратный элемент. Если ты имеешь ввиду что-то другое - не называй это делением.

нет. Следовательно, обратного числа к нулю нет внутри любого конечного подмножества некоторых чисел.

Обратного числа к нулю не может быть нигде и никогда по определению нуля.

anonymous
()
Ответ на: комментарий от emulek

а может существовать _реальный_ компьютер с нереальным размером памяти? Ты что курил сегодня?

Какой компьютер, недоумок? Еще раз - речь о программе. Для определенности будем считать что исполнять ее я буду сам, в уме, помогая себе ручкой и бумажным блокнотом. Чему будет равно N?

Я о компьютере.

Но МТ не имеет отношения к компьтерам. Только к программам.

А программа без него не имеет смысла.

Программа имеет смысл, если есть семантика ЯП и она синтаксически корректна. Наличие компьютера никто не ебет. Можно считать, что вообще нету никаких компьютеров, если тебе так проще.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.