12.11. 真偽値(Booleans)

🔗inductive type
Bool : Type

Bool is the type of boolean values, true and false. Classically, this is equivalent to Prop (the type of propositions), but the distinction is important for programming, because values of type Prop are erased in the code generator, while Bool corresponds to the type called bool or boolean in most programming languages.

Constructors

false : Bool

The boolean value false, not to be confused with the proposition False.

true : Bool

The boolean value true, not to be confused with the proposition True.

コンストラクタ Bool.trueBool.falseBool 名前空間からエクスポートされるため、 truefalse と書くことができます。

12.11.1. ランタイム表現(Run-Time Representation)

Bool列挙帰納的 型であるため、コンパイルされたコードでは1バイトで表現されます。

12.11.2. 真偽値と命題(Booleans and Propositions)

BoolProp はどちらも真理の概念を表します。純粋論理の観点から見ると、両者は同等です: propositional extensionality は基本的に2つの命題、すなわち TrueFalse しか存在しないことを意味します。しかし、実用上は重要な違いがあります: Bool はプログラムで計算できる を分類し、 Prop はコード生成が意味を為さない文を分類します。言い換えると、 Bool はプログラムに適した真偽の概念であり、 Prop は数学に適した概念です。コンパイルされたプログラムから証明は消去されるため、 BoolProp を区別しておくことで Lean ファイルのどの部分が計算を目的としているかが明確になります。

BoolProp が期待されているところではどこでも使うことができます。すべての Bool b から命題 b = true への coercion が存在します。 propext により、 true = trueTrue に、 false = trueFalse にそれぞれ等しいです。

全ての命題をプログラムがランタイム時の判断に使えるわけではありません。そうでなければコラッツ予想が真か偽かでプログラムが分岐してしまいます!しかし、多くの命題はアルゴリズムでチェックすることができます。これらの命題は 決定可能 な命題と呼ばれ、 Decidable 型クラスを持ちます。関数 Decidable.decide は証明を格納した Decidable の結果を Bool に変換します。この関数は決定可能な命題から Bool への強制演算でもあるため、 (2 = 2 : Bool)true と評価されます。

12.11.3. 構文(Syntax)

syntax

中置演算子 &&||^^ はそれぞれ Bool.andBool.orBool.xor の表記です。

term ::= ...
    | `and x y`, or `x && y`, is the boolean "and" operation (not to be confused
with `And : Prop → Prop → Prop`, which is the propositional connective).
It is `@[macro_inline]` because it has C-like short-circuiting behavior:
if `x` is false then `y` is not evaluated.
term && term
term ::= ...
    | `or x y`, or `x || y`, is the boolean "or" operation (not to be confused
with `Or : Prop → Prop → Prop`, which is the propositional connective).
It is `@[macro_inline]` because it has C-like short-circuiting behavior:
if `x` is true then `y` is not evaluated.
term || term
term ::= ...
    | Boolean exclusive or term ^^ term
syntax

前置演算子 !Bool.not の表記です。

term ::= ...
    | `not x`, or `!x`, is the boolean "not" operation (not to be confused
with `Not : Prop → Prop`, which is the propositional connective).
!term

12.11.4. API リファレンス(API Reference)

12.11.4.1. 論理演算子(Logical Operations)

関数 condandor は短絡します。つまり、 false && BIG_EXPENSIVE_COMPUTATIONfalse を返す前に BIG_EXPENSIVE_COMPUTATION を実行する必要はありません。これらの関数は macro_inline 属性を使用して定義されています。これによりコンパイラはコードを生成する際に関数の呼び出しを定義に置き換え、入れ子のパターンマッチを用いる定義が短絡評価されるようになります。

🔗def
cond.{u} {α : Type u} (c : Bool) (x y : α) : α

cond b x y is the same as if b then x else y, but optimized for a boolean condition. It can also be written as bif b then x else y. This is @[macro_inline] because x and y should not be eagerly evaluated (see ite).

🔗def
Bool.not : BoolBool

not x, or !x, is the boolean "not" operation (not to be confused with Not : Prop Prop, which is the propositional connective).

🔗def
Bool.and (x y : Bool) : Bool

and x y, or x && y, is the boolean "and" operation (not to be confused with And : Prop Prop Prop, which is the propositional connective). It is @[macro_inline] because it has C-like short-circuiting behavior: if x is false then y is not evaluated.

🔗def
Bool.or (x y : Bool) : Bool

or x y, or x || y, is the boolean "or" operation (not to be confused with Or : Prop Prop Prop, which is the propositional connective). It is @[macro_inline] because it has C-like short-circuiting behavior: if x is true then y is not evaluated.

🔗def
Bool.xor : BoolBoolBool

Boolean exclusive or

🔗def
Bool.atLeastTwo (a b c : Bool) : Bool

At least two out of three booleans are true.

12.11.4.2. 比較(Comparisons)

🔗def
Bool.decEq (a b : Bool) : Decidable (a = b)

Decidable equality for Bool

12.11.4.3. 変換(Conversions)

🔗def
Bool.toISize (b : Bool) : ISize
🔗def
Bool.toUInt8 (b : Bool) : UInt8
🔗def
Bool.toUInt16 (b : Bool) : UInt16
🔗def
Bool.toUInt32 (b : Bool) : UInt32
🔗def
Bool.toUInt64 (b : Bool) : UInt64
🔗def
Bool.toUSize (b : Bool) : USize
🔗def
Bool.toInt8 (b : Bool) : Int8
🔗def
Bool.toInt16 (b : Bool) : Int16
🔗def
Bool.toInt32 (b : Bool) : Int32
🔗def
Bool.toInt64 (b : Bool) : Int64
🔗def
Bool.toNat (b : Bool) : Nat

convert a Bool to a Nat, false -> 0, true -> 1