atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
TLA+メモ@ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
TLA+メモ@ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
TLA+メモ@ウィキ
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • TLA+メモ@ウィキ
  • 型 (Type)

TLA+メモ@ウィキ

型 (Type)

最終更新:2023年11月06日 00:54

tlaplus

- view
メンバー限定 登録/ログイン

型 (Type)


型の指定について

TLA+では、変数に対して明示的な型を指定することはない(型自体がないわけではない)。
一般的に変数に対する制約を述語や不変条件で表現する。

\inによる指定


例えば、以下ではxが1から3、yが1から5の整数であることを示している。このRangeInvariantは条件が満たされていればtrueを返す。

VARIABLES x, y
 
RangeInvariant ==
    /\ x \in {1,2,3}
    /\ y \in 1..5
 

上記を不変条件として検証を行うことは、変数xを1から3の値をとる整数型、変数yを1から5の値をとる整数型であることを定義することに等しい。

補足:
TLA+では範囲演算子を使用することができ、集合{1,2,…,n}を1..nのように定義できる。以下は同じ集合となる。

1..3 = {1,2,3} 

プリミティブ型 (基本的なデータ タイプ)


TLA+で利用可能な基本的なデータ型それぞれの特徴や使用方法を説明する。
TLA+には、整数、ブール値、文字列、モデル値の4種類のプリミティブな型がある。

整数


EXTENDS IntegersでモジュールIntegersをロードすることで算術演算子 (+, -, %, *) を使用できる。除算は”\div”とあらわす。整数除算となる。

文字列


文字列は、文字のシーケンスを表現するために使用されるデータ型で文字列はダブルクォーテーションで囲まれた文字から構成される。
TLA+では、文字列の結合や部分文字列の取得などの基本的な文字列操作がサポートされる。

  • 文字列は\o (または\circ)で連結することができる。
  • 値vの文字列への変換はToString(v)を使用する。
  • 文字列の長さはLen(s)で取得できる
  • 部分文字列はSubSeq関数を使用して、文字列の部分文字列を取得することができる。SubSeq(s, m, n)は、文字列sのm番目からn番目の文字までの部分文字列を返す。

複合型


集合


集合は順序を持たない要素の集まりで、同じ要素を2つ持つことはない。集合内の要素の型はすべて同じでなければならない。
例えば以下のように定義できる。

set = {"a","b","c"} 

集合に対する演算子は以下がある。

演算子 意味 例
x \in set 集合setの要素x
x ⊂ set
1 \in {1,2,3}
x \notin set 集合setの要素でないx
x ⊄ set
4 \notin {1,2,3}
set1 \subseteq set2 set2の部分集合set1
set1 ⊂ set2
{1,2} \subseteq {1,2,3}
set1 \union set2 和集合
※\cupも可
{1,2} \union {2,3} = {1,2,3}
set1 \intersect set2 積集合
※\capも可
{1,2} \intersect {2,3} = {2}
set1 \ set2 差集合
set1 – set2
{1,2,3} \ {2} = {1,3}
SUBSET {"a", "b"} 冪集合 SUBSET {1,2} = {{}, {1}, {2}, {1,2}}
Cardinarity(set1) 要素数
(EXTENDS FiniteSetsが必要)
Cardinarity({1,2,3}) = 3

以下のように集合の変換を行うこともできる。

演算子 意味 例
{x \in set: 条件式} フィルタリング
条件式を満たすsetの要素xを返す
{x \in 1..4: x < 3}
>> {1, 2}
{式: x \in set} マッピング
setの要素xに対して式を適応する
{x * 3: x \in 1..3}
>> {3, 6, 9}

タプル (シーケンス)

タプルは順序を持つ要素のコレクションで配列のようであるが要素の型は同じでなくてもよい。タプルのインデックスは1始まりとなる。
例えば tup = <<”a”, {1, 2}>> と記述した場合は、tup[1] = “a”, tup[2] = {1, 2}となる。

EXTENDS Sequences を指定することで次のシーケンス演算子を使うことができる。

演算子 意味 例
Head(seq) 先頭 Head(<<1, 2, 3>>)
>>1
Tail(seq) 先頭以外 Tail(<<1, 2, 3>>)
>> <<2, 3>>
Append(seq, x) 末尾に追加 Append(<<1, 2>>, 3)
>> <<1, 2, 3>>
seq1 \o seq2 結合 <<1, 2>> \o <<3, 4>>
>> <<1, 2, 3, 4>>
Len(seq) 長さ Len(<<1, 2, 3>>)
>> 3
SubSeq(seq, index1, index2) スライス SubSeq(seq, 1, Len(seq) - 1)
>> 末尾の要素以外

タプルはシーケンスとも呼ばれるがシーケンス演算子を使う予定がない場合はタプル、シーケンス演算子を使う場合はシーケンスと呼ぶのが慣例となっている。

構造体 (あるいはレコード)


構造体は文字列に対して、値をマッピングすることができる。値へのアクセスは、struct.key でアクセスできる。

person = [name |-> "taro", age |-> 22, gender |-> "male"]
person.name
>> "taro"
 

struct.keyはstruct["key"]の糖衣構文なので以下でも同様となる。

person = [name |-> "taro", age |-> 22, gender |-> "male"]
person["name"]
>> "taro"
 

入れ子になった構造体には以下のようにしてアクセスできる。
struct = [ a |-> 1, b |-> [ x |-> 2, y |-> 3 ] ] 
struct.b.x
>> 2
 

関数


関数は一連の入力(定義域)を一連の出力にマッピングする。関数はすべて[x \in set |-> P(x)]の形式をとる。

入力
[x \in 1..2 |-> x*2]
 
出力
 <<2,4>>
 

TLA+における関数とは写像のことを意味している。一般的なプログラム言語で関数やプロシジャと呼ばれるものは演算子 (Operator)にあたる点に注意が必要。

演算子と異なり、定義域を指定する必要がある。

タプルと構造体


タプルと構造体は特別な関数である。タプルは定義域が1…nの関数であり、構造体は定義域が文字列の関数である。
そのため、タプル、構造体は関数と同様に操作することができる。

DOMAIN


DOMAINを使うことで関数の定義域(関数の入力としてとることのできる値の集合)を求めることができる。

DOMAIN [x \in 1..2 |-> x*2]
>>{1,2}
 

構造体に対しても同様にキーを取得することができる。

person = [name |-> "taro", age |-> 22, gender |-> "male"]
DOMAIN person
>>{"name", "age", "gender"}
 

関数と演算子の違い

  • 演算子はある値を別の値に変換する。関数は、その定義域(ドメイン)内の各要素に対する値を返す。
  • 関数がそのドメイン内の値に対してのみ定義されるのに対し、演算子は任意の値を入力に持つ。

関数の集合


[set1 -> set2] とすることでset1の要素をset2の要素にマッピングするすべての関数からなる集合を定義することができる。”|->”ではなく”->”である点に注意。関数の集合は複雑な仕様を書く際に役に立つ。

[{"a","b","c"}->{1,2}]
 
Value:
{ [a |-> 1, b |-> 1, c |-> 1],
     [a |-> 1, b |-> 1, c |-> 2],
     [a |-> 1, b |-> 2, c |-> 1],
     [a |-> 1, b |-> 2, c |-> 2],
     [a |-> 2, b |-> 1, c |-> 1],
     [a |-> 2, b |-> 1, c |-> 2],
     [a |-> 2, b |-> 2, c |-> 1],
     [a |-> 2, b |-> 2, c |-> 2] }
 

以下の値がタプルの集合となっているのは、タプルは定義域が1…nの関数であることから。

[{1,2}->{"a","b","c"}]
 
Value:
{ <<"a", "a">>,
     <<"a", "b">>,
     <<"a", "c">>,
     <<"b", "a">>,
     <<"b", "b">>,
     <<"b", "c">>,
     <<"c", "a">>,
     <<"c", "b">>,
     <<"c", "c">> }
 

関数の集合をうまく利用すると値同士の組み合わせのパターンを生成することができる。

定数 (Const)


定数を定義することもできる。

CONSTANT VALUE1, VALUE2 

上記の定義を追加すると後述のTLA+ToolBoxのModel Overviewに以下のように値が表示され、値を定義することができる。



通常の割り当て (Ordinary assignment)


定数には、数値、集合、シーケンス、関数などTLA+のどの値でも設定できる。

Days <-1..31
CupSizes <- {“Short”, “Tall”, “Grande”, “Venti”}
 

モデル値 (Model Value)


定数にモデル値を代入することでその定数はそれ自身にのみ等しい値となる。つまり、C言語の列挙型のような抽象的なユーザー独自の定数を定義することができる。

facebook <- [ model value ]
User <- [ model value ]
 

Set of model values


Set of Model Valuesは、複数のModel Valueを含む集合を定数に割り当てることができる。

Apps <- [ model value ] {facebook, twitter, instagram}
Users <- [ model value ] {user1, user2}
 

定数の定義方法(2)


TLA+ToolBoxを使わず、値を設定することができる。例えば以下は名前が" Items "の定数を宣言し、定数に具体的な値を割り当てる。

CONSTANTS Items
Items == {“a”,”b”,”c”}
 

また、引数をとらず定数を返す演算子を定義することで実質的に定数として使うことができる。(CONSTANTSによる宣言をせず、直接下記を記述する。)

Items == {“a”,”b”,”c”}
 
「型 (Type)」をウィキ内検索
LINE
シェア
Tweet
添付ファイル
  • What_is_the_model.jpg

[Amazon商品]


TLA+メモ@ウィキ
記事メニュー

メニュー

  • トップページ
  • TLA+とは
  • ボイラープレート
  • 型 (Type)
  • 文法 (Syntax)
  • PlusCal構文
  • 時相論理 (temporal logic)
  • TLA+ TooolBox
  • よく使う表現
  • 例題


リンク

  • The TLA+ Home Page
  • TLA+ Foundation
  • TLA+ GitHub
  • TLA+ Video Course (YouTube)
  • Learn TLA+
  • @wiki
  • @wikiご利用ガイド


アクセス

今日: -
昨日: -
合計: -


ここを編集
記事メニュー2

人気のページ

  • TLA+とは
  • PlusCal構文
  • 食事する哲学者の問題
  • トップページ
  • 型 (Type)
  • 例題
  • 文法 (Syntax)
  • 時相論理 (temporal logic)
  • うそつき牛(レイトン教授)
  • ボイラープレート

更新履歴


編集履歴

取得中です。

ここを編集
最近更新されたページ
  • 58日前

    TLA+とは
  • 58日前

    メニュー
  • 434日前

    PlusCal構文
  • 618日前

    型 (Type)
  • 619日前

    時相論理 (temporal logic)
  • 636日前

    文法 (Syntax)
  • 774日前

    川渡り問題
  • 775日前

    例題
  • 779日前

    うそつき牛(レイトン教授)
  • 779日前

    食事する哲学者の問題
もっと見る
最近更新されたページ
  • 58日前

    TLA+とは
  • 58日前

    メニュー
  • 434日前

    PlusCal構文
  • 618日前

    型 (Type)
  • 619日前

    時相論理 (temporal logic)
  • 636日前

    文法 (Syntax)
  • 774日前

    川渡り問題
  • 775日前

    例題
  • 779日前

    うそつき牛(レイトン教授)
  • 779日前

    食事する哲学者の問題
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. AviUtl2のWiki
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  6. ソードランページ @ 非公式wiki
  7. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  8. ドラゴンボール Sparking! ZERO 攻略Wiki
  9. 星飼いの詩@ ウィキ
  10. ヒカマーWiki
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 発車メロディーwiki
  7. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  9. オレカバトル アプリ版 @ ウィキ
  10. MadTown GTA (Beta) まとめウィキ
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. モンスター一覧_第2章 - モンスター烈伝オレカバトル2@wiki
  3. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  4. 高崎線 - 発車メロディーwiki
  5. 近藤旬子 - 馬主データベース@Wiki
  6. 地獄のデザイナーさん1 - 【トレパク】 きりつき 検証まとめwiki 【地獄のデザイナーさん】
  7. 召喚 - PATAPON(パタポン) wiki
  8. 細田守 - アニヲタWiki(仮)
  9. ステージ攻略 - パタポン2 ドンチャカ♪@うぃき
  10. 鬼レンチャン(レベル順) - 鬼レンチャンWiki
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.