追加機能
属性
Liloの定義、仕様、パラメータ、シグナルは、/// で始まるdocstringに加え、属性でも注釈を付けることができます。属性は、注釈対象の直前に配置する必要があります。
属性は、ツール(特にVSCode拡張機能)によって使用される、注釈付き項目に関するメタデータを伝えるために使用されます。
#[key = "value", fn(arg), flag]
spec foo = true
- 未使用変数の警告を抑制する:
#[disable(unused)]- この属性を定義、パラメータ、またはシグナルに使用すると、未使用であることに関する警告が抑制されます。
- 仕様または公開されている定義は、常に使用されているとみなされます。
- 静的解析のタイムアウト
- 静的解析のデフォルトのタイムアウトをオーバーライドするには、
timeoutを秒単位で指定できます。 - 次のようにして静的解析の項目ごとのタイムアウトを個別に指定できます:
#[timeout(satisfiability = 20, redundancy = 30)] - または、次のようにして両方を10秒に設定することもできます:
#[timeout(10)]
- 静的解析のデフォルトのタイムアウトをオーバーライドするには、
- 静的解析を無効にする
#[disable(satisfiability)]または#[disable(redundancy)]を使用して、定義に対する特定の静的解析を無効にします。
パラメータのデフォルト値
システムを記述する際、パラメータにはデフォルト値を指定することもできます。こうしたデフォルト値は、典型的な用例ではパラメータがそのデフォルト値でインスタンス化されるであろうことを意図するために使えます。
param temperature: Float = 25.0
デフォルト値は定数を宣言するために使用すべきものではありません。定数には、代わりに def を使用してください。
def pi: Float = 3.14159
- モニタリング時、デフォルト値を持つパラメータは入力から省略できます。省略された場合、デフォルト値が使用されます。明示的に指定することもでき、その場合は指定された値が使用されます。
- 式をエクスポートする際、デフォルト値を持つパラメータは、エクスポート前にデフォルト値で置換されます。
- デフォルト値が設定されている場合、Exemplification(例示化)機能は、ソルバーにパラメータをデフォルト値に固定するよう要求します(デフォルト値が与えられていない場合は、パラメータは自由変数として扱われます)。
エクスポートや例示化などの分析を実行する際、設定のフィールドにJSONのnullを指定することができ、これによりSpecForgeは該当パラメータのデフォルト値を無視するようになります。
system main
signal p: Int
param bound: Int = 1
spec foo = p > 1 && p < bound
- 例示化(Exemplification)
params = {}の場合: 充足不可能(boundのデフォルト値が使用されます)params = { "bound": null }の場合: 充足可能(ソルバーは制約を満たすboundの値を自由に選択できます)
- エクスポート
params = {}の場合: 出力結果はp > 1 && p < 1params = { "bound": 100 }の場合: 出力結果はp > 1 && p < 100params = { "bound": null }の場合: 出力結果はp > 1 && p < bound
JSONのnull自体をLiloプログラム中でデフォルト値として使用することはできません。
仕様スタブ
ユーザーは、実体を持たない仕様(仕様スタブ)を定義できます。こうしたスタブも、通常の定義と同様にdocstringと属性を持つことができます。スタブはプレースホルダーとして使用でき、Liloの周辺ツールによってtrueとして解釈されます。
VSCode拡張機能は、(設定されている場合は)docstringに基づいてLLMによりスタブの実装を生成するためのコードレンズを表示します。
/// システムは常に最終的にエラーから回復する必要があります。
spec error_recovery