Короткая история
Известный компьютерный ученый Тарьян написал книгу несколько лет назад. Он содержит абсолютно странный псевдокод. Кто-нибудь, пожалуйста, объясните это?
Длинная история
Тарьян известен многими достижениями, в том числе тем, что он был соавтором кустарников . Он опубликовал книгу " Структуры данных и сетевые алгоритмы » в 1980-х годах.
Весь псевдокод в книге Тарьяна написан на языке его собственного изобретения. Соглашения о псевдокоде очень регламентированы. Это почти настоящий язык, и можно было бы написать для него компилятор. Тарьян пишет, что его язык основан на следующих трех:
Я надеюсь, что кто-то, знакомый с одним или двумя из вышеперечисленных языков или работой Тарьяна, сможет ответить на мой вопрос.
Пример функции, написанной на языке Тарьяна, показан ниже:
heap function mesh (heap nodes h1, h2);
if key(h1) > key(h2) → h1 ⟷ h2 fi;
right (h1) := if right(h1) = null → h2
|right(h1) ≠ null → mesh (right(h1), h2) fi;
if rank (left (h1)) < rank (right (h1)) → left(h1) ⟷ right(h1) fi;
rank (h1) := rank(right(h1)) + 1;
return h1,
end mesh;
Я видел много псевдокода, но я никогда не видел ничего подобного Тарьяну. Как работает псевдокод Тарьяна? Как можно переписать примеры псевдокода Тарьяна как нечто, похожее на C или Java? Это даже не должно быть C или Java. Конструкция if-else на языке Тарьяна не только отличается от языков семейства C, но также отличается от Python, MATLAB и многих других.
источник
return
утверждение заканчивается запятой?Ответы:
Оглавление
Я разделю свое объяснение псевдокода Тарьяна на следующие разделы:
->
&|
):=
и=
)else if
, но нетelse
конструкции:= if
Дополнительные примеры Тарьяна
if
и:= if
5.5. Тарьяновые массивы (или списки)
Резюме операторов
⟷
)(1) Блоки Тарьяна, если бы еще
(операторы
→
а|
)if-else
Конструкция является , пожалуй, наиболее фундаментальной структурой управления на языке Tarján в. В дополнение к C-подобным if-блокам, поведение if-else очень близко встроено в назначения Тарьяна и циклы while. Оператор стрелки Тарьяна->
(или →) является разделителем между условием оператора if и блоком выполнения оператора if.Например, на языке Тарьяна мы можем иметь:
Если мы частично переведем приведенную выше строку кода Тарьяна в C или Java, мы получим следующее:
Вместо правильных фигурных скобок (как в C и Java) Тарьян оканчивает
if
-блок с помощью слов на английском языке в стиле АЛГОЛ:fi
Если мы продолжим перевод нашего примера выше, мы получим:
(2) Тесты на присвоение и равенство (
:=
и=
)Тарьян берет эти операторы из ALGOL (позже это также можно увидеть в Pascal).
Тарьян использует
=
для тестов на равенство, а не для заданий (поэтому он работает как Java==
).Для назначения Тарьян использует
:=
, который работает как Java=
.Таким образом, если мы продолжим перевод нашего примера, мы получим:
Вертикальная черта (или «труба» или
|
) на языке Тарьяна эквивалентнаelse if
ключевому слову в Си или Java.Например, на языке Тарьяна мы можем иметь:
Tarjan-код выше переводится как:
(3)
else if
только и безelse
конструкцииРаньше я освещал основы
if
-слов без описания нюансов. Однако мы не будем обсуждать мелкие детали. Последнее предложение вif-else
блоке Tarjan-ian всегда должно содержать оператор arrow (→
). Таким образом, нет толькоelse
на языке Тарьянаelse if
. Самым близким кelse
-блоку в языке Тарьяна является создание самого правильного условия тестаtrue
.В C / Java мы бы имели:
Примеры легче понять, чем общие описания. Однако теперь, когда у нас есть несколько примеров за поясом, знайте, что общий формал конструкции Тарьяна if-else выглядит следующим образом:
Персонаж
|
какif else
Символ
→
отделяет тестовое условие от материала для дел.(4) Оператор условного присвоения Тарьяна
:= if
Тарьяна
if
можно использовать двумя совершенно разными способами. До сих пор мы описали только одно из применений тарджанцевif
. Несколько запутанно, но Тарьян все еще использует нотацию / синтаксисif
для второго типаif
-construct. Тоif
, что используется, основано на контексте. Анализ контекста на самом деле очень прост, поскольку второй тип таржанаif
всегда предопределен оператором присваивания.Например, у нас может быть следующий код Тарьяна:
Начните отступление
Поработав некоторое время с кодом Тарьяна, вы привыкаете к порядку операций. Если мы заключим условие проверки в скобки в приведенном выше примере, мы получим:
a = 4
не является операцией присваивания.a = 4
это какa == 4
- он возвращает истину или ложь.Конец отступления
Это может помочь представить
:= if
синтаксис для одного оператора, отличного от:=
и,if
фактически, мы будем ссылаться на:= if
оператор оператором условного присваивания.Ибо
if
мы перечислим(condition → action)
. Поскольку:= if
мы перечисляем,(condition → value)
гдеvalue
находится значение правой стороны, мы могли бы присвоить левой сторонеlhs
в C или Java может выглядеть так:
Рассмотрим следующий пример «условного присваивания» в коде Тарьяна:
# Тарьян Пример пятого примера x: = a = 4 → 9 | a> 4 → 11 | правда → 99 фи
В C / Java мы бы имели:
(5) Резюме операторов:
Пока что имеем:
:=
...... Оператор присваивания (C / Java=
)=
...... Тест на равенство (C / Java==
)→
...... Разделитель между тестовым состоянием блока if и телом блока if|
..... C / Java еще-еслиif ... fi
..... блок if-else:= if... fi
..... Условное присвоение на основе блока if-else(5.5) Тарьянские списки / массивы:
Язык Тарьяна имеет встроенные контейнеры, похожие на массивы. Синтаксис для массивов Тарьяна намного более интуитивен, чем запись для
if else
операторов Тарьяна .Доступ к элементам массива Тарьяна осуществляется с помощью круглых скобок
()
, а не квадратных скобок[]
Индексирование начинается с
1
. Таким образом,Ниже показано, как создать новый массив, содержащий 1-й и 5-й элементы
[1, 2, 3, 4, 5, 6, 7]
Оператор равенства определен для массивов. Следующий код печатает
true
Тарьян может проверить, является ли массив пустым, - сравнить его с пустым массивом.
Можно создать представление (не копировать) подмассива, предоставив оператору несколько индексов в
()
сочетании с..
(6) Дополнительные примеры Тарьяна
if
и:= if
Ниже приведены другие примеры условного присваивания Тарьяна (
:= if
):(true --> b)
самый левый(cond --> action)
пункт, имеющий истинное условие. Таким образом, исходный пример шестого присваивания имеет то же поведение присваивания, что иa := b
Ниже приведен наш самый сложный пример кода Тарьяна:
Ниже приведен перевод кода Тарьяна для объединения двух отсортированных списков. Следующее не совсем C или Java, но гораздо ближе к C / Java, чем версия Tarjan.
Ниже приведен еще один пример кода Tarjan и перевода в нечто похожее на C или Java:
Ниже приведен перевод C / Java:
(7) Оператор двухконечной стрелы Тарьяна (
<-->
)Ниже приведен пример кода Тарьяна:
Что делает оператор Double Arrow (
⟷
) на языке Тарьяна?Ну, почти все переменные в языке Тарьяна являются указателями.
<-->
это операция обмена Следующие принтыtrue
После выполнения
x <--> y
,x
указывает на объект , которыйy
используется для указания , иy
указывает на объект , которыйx
используется для указания.Ниже приведено выражение Tarjan с использованием
<-->
оператора:Ниже приведен перевод кода Тарьяна выше в альтернативный псевдокод:
В качестве альтернативы мы могли бы иметь:
Ниже приведен пример одной из функций Тарьяна с использованием
⟷
оператора:Ниже приведен перевод функции Тарьяна
mesh
в псевдокод, который не является C, но больше похож на C (условно говоря). Цель этого - показать, как работает⟷
оператор Тарьян .(8) Do-циклы Тарьяна похожи на циклы while C / Java
Язык
if
иfor
конструкции Тарьяна знакомы программистам C / Java. Однако ключевое слово Tarjan для цикла while - этоdo
. Всеdo
-loops заканчиваются ключевым словомod
, которое является обратным написаниемdo
. Ниже приведен пример:В псевдокоде в стиле C мы имеем:
Вышесказанное на самом деле не совсем верно. Do-цикл Tarjan - это действительно C / Java
while(true)
с вложенным в него блоком if-else. Более буквальный перевод кода Тарьяна выглядит следующим образом:Ниже у нас есть более сложный Tarjan-
do
цикл:Псевдокод в стиле C / Java для сложного
do
цикла Tarjan выглядит следующим образом:(9) Оператор условного присваивания Тарьяна со всеми ложными условиями
Хотя длинное объяснение выше охватывает большинство вещей, некоторые вопросы все еще остаются нерешенными. Я надеюсь, что кто-то еще когда-нибудь напишет новый улучшенный ответ, основанный на моем, который отвечает на эти проблемы.
Примечательно, что когда используется оператор условного присваивания
:= if
, и никакое условие не является истинным, я не являюсь тем, какое значение присваивается переменной.Я не уверен, но возможно, что никакое назначение не сделано
x
:Вы могли бы потребовать, чтобы переменная левой стороны, видимая в
:= if
выражении, была предварительно объявлена. В этом случае, даже если все условия ложные, переменная все равно будет иметь значение.В качестве альтернативы, возможно, все ложные условия представляют собой ошибку времени выполнения. Другой вариант - вернуть специальное
null
значение и сохранить егоnull
в левом аргументе присваивания.источник
=
означает сравнение, чем где это означает присвоение (если бы я когда-либо писал язык, я сделал бы это синтаксической ошибкой, и просто имел бы:=
и==
). С другой стороны, оператор подкачки - это то, что происходит только в специализированных языках, где это была обычная операция; на других языках, хотя, вы могли бы просто взять на себя функцию библиотеки под названиемswap
и заменитьh1 ⟷ h2
с ,swap(h1, h2)
а не выписывая об осуществлении каждый раз.[1, 2] = [1, 2, 3, 4, 5]
правда?|
Оператор является охранником . Они используются в Haskell (и я полагаю, что другие функциональные языки) в определениях функций:f x | x == 0 = 1; x == 1 = 1; otherwise = f (x-1) + f(x-2)
здесьotherwise
есть псевдонимTrue
иf
определяет числа Фибоначчи.Никогда раньше такого не видел, но я думаю, что могу понять, что имеется в виду из контекста. Предположительно,
⟷
операция должна быть операцией подкачки иif G1 -> S1 | G2 - >S2 | ... fi
является конструкцией типа if / then / else, которая также возвращает значение, как троичный?:
оператор в C и Java.Имея это в виду, мы могли бы написать вышеупомянутую функцию на Java-подобном языке следующим образом:
источник