目次
Tarjanの擬似コードの説明を次のセクションに分けます。
- TarjanのIf-elseブロック(
->
&|
演算子)
- 割り当てと同等性のテスト(
:=
および=
)
- がありますが
else if
、else
コンストラクトはありません
- タージャンの条件付き割り当て演算子
:= if
Tarjan if
および:= if
5.5 の追加例。
Tarjan配列(またはリスト)
オペレーターの概要
- タージャンの両方向矢印演算子(
⟷
)
- TarjanのdoループはC / Java whileループのようなものです
- すべての偽条件を持つタージャンの条件付き代入演算子
(1)タージャンのIf-elseブロック
(オペレータ→
と|
)
if-else
コンストラクトは、おそらくTarjanの言語の中で最も基本的な制御構造です。Cのようなifブロックに加えて、if-elseの動作はTarjanの割り当てとTarjanのwhileループにほぼ組み込まれています。Tarjanの矢印演算子->
(または→)は、ifステートメントの条件とifステートメントの実行ブロックの間の区切り文字です。
たとえば、タージャンの言語では次のようになります。
# Example One
if a = 4 → x := 9 fi
上記のTarjanコードの行を部分的にCまたはJava に変換すると、次のようになります。
if (a = 4)
x := 9
fi
(CやJavaのように)右中括弧の代わりに、タージャンif
は、キーワードのALGOLのような逆スペルで-blockを終了します。fi
上記の例を翻訳し続けると、次のようになります。
if (a = 4) {
x := 9
}
(2)割り当ておよび平等テスト(:=
および=
)
Tarjanはこれらの演算子をALGOLから取得します(後でPascalでも見られます)。
Tarjanは=
、割り当てではなく同等性テストに使用します(したがって、Javaのように機能します==
)。
割り当てには、Tarjanは:=
Javaのように機能するを使用します=
。
したがって、例を翻訳し続けると、次のようになります。
if (a == 4) {
x = 9
}
|
Tarjanの言語の垂直バー(または「パイプ」または)はelse if
、CまたはJavaのキーワードと同等です。
たとえば、タージャンの言語では次のようになります。
# Example Two
if a = 4 → x := 9 | a > 4 → y := 11 fi
上記のTarjanコードは次のように変換されます。
if (a == 4) {
x = 9
}
else if (a > 4) {
y = 11
}
(3)else if
のみなしelse
構築
前に、if
ニュアンスを説明せずに- ステートメントの基本を説明しました。ただし、詳細については説明しません。Tarjan-ian if-else
ブロックの最後の句には、常に矢印(→
)演算子を含める必要があります。そのためelse
、タージャンの言語にはありませんelse if
。else
Tarjanの言語のブロックに最も近いのは、一番右のテスト条件を作成することtrue
です。
if a = 4 → x := 9 | a > 4 → y := 11 | true → z := 99 fi
C / Javaでは、次のようになります。
if (a == 4) {
x = 9
}
else if (a > 4) {
y = 11
}
else { // else if (true)
z = 99
}
例は一般的な説明よりも理解しやすいです。ただし、今ではいくつかの例がありますが、タージャンのif-elseコンストラクトの一般的な形式は次のとおりであることを知っています。
if condition
→ stuff to do
| condition
→ stuff to do
[...]
| condition
→ stuff to do
fi
キャラクター |
はif else
キャラクター→
は、テスト条件とスタッフの仕事を分けます。
(4)タージャンの条件付き割り当て演算子 := if
Tarjanのは、if
2つの非常に異なる方法を使用することができます。これまでのところ、タルヤニア語の使用法の1つだけを説明しましたif
。やや紛らわしいことに、Tarjanはまだ-constructのif
2番目のタイプに表記法/構文を使用していますif
。どちらif
が使用されているかは、コンテキストに基づいています。2番目のタイプのTarjan- if
は常に代入演算子によって事前に固定されているため、コンテキストの分析は実際には非常に簡単です。
たとえば、次のTarjanコードがあるとします。
# Example Three
x := if a = 4 → 9 fi
余談を開始
Tarjanコードをしばらく使用した後、操作の順序に慣れます。上記の例でテスト条件を括弧で括ると、次のものが得られます。
x := if (a = 4) → 9 fi
a = 4
割り当て操作ではありません。a = 4
のようなものa == 4
です。trueまたはfalseを返します。
余談を終わらせる
それは考えるのを助けることができる:= if
とは別個の、単一のオペレータのための構文として:=
およびif
実際には、我々が参照する:= if
「条件付き代入」演算子と演算子。
以下のためのif
私たちのリスト(condition → action)
。:= if
我々はリスト(condition → value)
ところvalue
、我々は左手側に割り当てることができますtehの右辺値でありますlhs
# Tarjan Example Four
lhs := if (a = 4) → rhs fi
CまたはJavaの場合は次のようになります。
# Example Four
if (a == 4) {
lhs = rhs
}
Tarjanianコードの「条件付き割り当て」の次の例を考えてみましょう。
#例5のタージャンのインスタンス化x:= a = 4→9 | a> 4→11 | true→99 fi
C / Javaでは、次のようになります。
// C/Java Instantiation of Example Five
if (a == 4) {
x = 9
}
else if (a > 4) {
x = 11
}
else if (true) { // else
x = 99
}
(5)オペレーターの要約:
これまでのところ、次のものがあります。
:=
......代入演算子(C / Java =
)
=
......同等性テスト(C / Java ==
)
→
...... ifブロックのテスト条件とifブロックの本体の間の区切り文字
|
..... C / Java else-if
if ... fi
..... if-elseブロック
:= if... fi
..... if-elseブロックに基づく条件付き割り当て
(5.5)タージャンリスト/配列:
Tarjanの言語には、配列のようなコンテナが組み込まれています。Tarjan配列の構文は、Tarjan if else
ステートメントの表記よりもはるかに直感的です。
list1 := ['lion', 'witch', 'wardrobe'];
list2a := [1, 2, 3, 4, 5];
list2b := [1, 2];
list3 := ["a", "b", "c", "d"];
list4 := [ ]; # an empty array
Tarjan配列elementaは()
、角括弧ではなく括弧でアクセスされます[]
インデックス作成はから始まります1
。したがって、
list3 := ["a", "b", "c", "d"]
# list3(1) == "a" returns true
# list3(2) == "b" return true
以下は、の1番目と5番目の要素を含む新しい配列を作成する方法を示しています [1, 2, 3, 4, 5, 6, 7]
nums := [1, 2, 3, 4, 5, 6, 7]
new_arr := [nums(1), nums(5)]
等価演算子は配列に対して定義されます。次のコードは印刷しますtrue
x := false
if [1, 2] = [1, 2, 3, 4, 5] --> x := true
print(x)
配列が空かどうかをテストするタージャンの方法は、空の配列と比較することです
arr := [1, 2]
print(arr = [ ])
# `=` is equality test, not assignment
一つは、オペレータに複数の指標を提供することにより、サブアレイ(コピーしない)ビューを作成することができる()
と組み合わせます..
list3 := ["a", "b", "c", "d"]
beg := list3(.. 2)
# beg == ["a", "b"]
# beg(1) == "a"
end := list3(3..)
# end == ["c", "d"]
# end(1) == "c"
mid := list3(2..3)
# mid == ["b", "c"]
# mid(2) == "c"
# `list3(4)` is valid, but `mid(4)` is not
(6)タージャンif
および:= if
次に、タージャン条件付き割り当て(:= if
)の別の例を示します。
# Tarjan Example Six
a := (false --> a | true --> b | false --> c1 + c2 | (2 + 3 < 99) --> d)
(true --> b)
(cond --> action)
真の条件を持つ左端の句です。したがって、元の割り当て例6には、次と同じ割り当て動作があります。a := b
以下は、これまでで最も複雑なTarjanコードの例です。
# Tarjan Example -- merge two sorted lists
list function merge (list s, t);
return if s =[] --> t
| t = [ ] --> s
| s != [ ] and t != [] and s(l) <= t(1) -->
[s(1)]& merge(s[2..], t)
| s != [ ]and t != [ ] and s(1) > r(l) -->
[t(1)] & merge (s,t(2..))
fi
end merge;
以下は、ソートされた2つのリストをマージするためのTarjanのコードの翻訳です。以下は正確にCやJavaではありませんが、TarjanバージョンよりもC / Javaにはるかに近いものです。
list merge (list s, list t) {
if (s is empty) {
return t;
}
else if (t is empty){
return s;
}
else if (s[1] <= t[1]) {
return CONCATENATE([s[1]], merge(s[2...], t));
else { // else if (s[1] > t[1])
return CONCATENATE ([t[1]], merge(s,t[2..]);
}
}
以下は、Tarjanコードの別の例と、CまたはJavaに似た翻訳です。
heap function meld (heap h1, h2);
return if h1 = null --> h2
| h2 = null --> h1
| h1 not null and h2 not null --> mesh (h1, h2)
fi
end meld;
以下はC / Javaの翻訳です。
HeapNode meld (HeapNode h1, HeapNode h2) {
if (h1 == null) {
return h2;
}
else if (h2 == null) {
return h1;
} else {
mesh(h1, h2)
}
} // end function
(7)タージャンの両方向矢印演算子(<-->
)
以下はTarjanコードの例です。
x <--> y
二重矢印(⟷
)演算子はタージャンの言語で何をしますか?
タージャンの言語のほとんどすべての変数はポインターです。
<-->
スワップ操作です。次のプリントtrue
x_old := x
y_old := y
x <--> y
print(x == y_old) # prints true
print(y == x_old) # prints true
を実行した後x <--> y
、x
ポイントしていたオブジェクトy
をポイントし、y
ポイントしていたオブジェクトx
をポイントします。
以下は、<-->
演算子を使用したTarjanステートメントです。
x := [1, 2, 3]
y := [4, 5, 6]
x <--> y
以下は、上記のタージャンコードから別の擬似コードへの翻訳です。
Pointer X = address of array [1, 2, 3];
Pointer Y = address of array [4, 5, 6];
Pointer X_OLD = address of whatever X points to;
X = address of whatever Y points to;
Y = address of whatever X_OLD points to;
または、次のようにすることもできます。
void operator_double_arrow(Array** lhs, Array** rhs) {
// swap lhs and rhs
int** old_lhs = 0;
old_lhs = lhs;
*lhs = *rhs;
*rhs = *old_lhs;
return;
}
int main() {
Array* lhs = new Array<int>(1, 2, 3);
Array* rhs = new Array<int>(4, 5, 6);
operator_double_arrow(&lhs, &rhs);
delete lhs;
delete rhs;
return 0;
}
以下は、⟷
演算子を使用したTarjanの関数の1つの例です。
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;
以下はTarjanのmesh
関数をCではない擬似コードに変換したものですが、Cに似ています(比較的言えば)。これの目的は、タージャンの⟷
オペレーターがどのように機能するかを説明することです。
node pointer function mesh(node pointers h1, h2) {
if (h1.key) > h2.key) {
// swap h1 and h2
node pointer temp;
temp = h1;
h1 = h2;
h2 = temp;
}
// Now, h2.key <= h1.key
if (h1.right == null) {
h1.right = h2;
} else // h1.key != null {
h1.right = mesh(h1.right, h2);
}
if (h1.left.rank < h1.right.rank ) {
// swap h1.left and h1.right
node pointer temp;
temp = h1;
h1 = h2;
h2 = temp;
}
h1.rank = h1.right.rank + 1;
return h1;
}
(8)TarjanのdoループはC / Java whileループに似ています
Tarjanの言語if
とfor
構成体は、C / Javaプログラマーに馴染みがあります。ただし、while-loopのTarjanキーワードはdo
です。すべてのdo
ループはキーワードod
で終わりdo
ます。これは、の逆スペルです。以下に例を示します。
sum := 0
do sum < 50 → sum := sum + 1
Cスタイルの擬似コードには、次のものがあります。
sum = 0;
while(sum < 50) {
sum = sum + 1;
}
上記は実際には正しくありません。Tarjan do-loopは、実際にはwhile(true)
if-elseブロックが内部にネストされたC / Java です。Tarjanコードのより文字通りの翻訳は次のとおりです。
sum = 0;
while(true) {
if (sum < 50) {
sum = sum + 1;
continue;
// This `continue` statement is questionable
}
break;
}
以下に、より複雑なTarjan do
ループを示します。
sum := 0
do sum < 50 → sum := sum + 1 | sum < 99 → sum := sum + 5
複雑なTarjan do
ループのC / Javaスタイルの擬似コードは次のとおりです。
sum = 0;
while(true) {
if (sum < 50) {
sum = sum + 1;
continue;
}
else if (sum < 99) {
sum = sum + 5;
continue;
}
break;
}
(9)すべての偽条件を持つタージャンの条件付き代入演算子
上記の長い説明はほとんどのことをカバーしていますが、いくつかの問題は未解決のままです。いつか他の誰かがこれらの怒りに答える私のものに基づいて新しい改善された答えを書くことを願っています。
特に、条件付き代入演算子:= if
が使用され、条件が真でない場合、変数にどの値が割り当てられているかはわかりません。
x := if (False --> 1| False --> 2 | (99 < 2) --> 3) fi
よくわかりませんが、次のものに割り当てられない可能性がありx
ます。
x = 0;
if (false) {
x = 1;
}
else if (false) {
x = 2;
}
else if (99 < 2) {
x = 3;
}
// At this point (x == 0)
:= if
ステートメントに見られる左側の変数は、事前に宣言する必要があります。その場合、すべての条件が偽であっても、変数にはまだ値があります。
あるいは、おそらくすべて偽の条件はランタイムエラーを表します。別の方法は、特別なnull
値を返しnull
、割り当ての左側の引数に格納することです。