Alloy 中如何指定 Int
How Int is specified in Alloy
我查看了 Alloy 中的 Int 实现(即 util 目录中的 integer.als
文件),我想出了以下表达式(除了许多其他人)我无法理解:
fun add [n1, n2: Int] : Int { this/plus[n1, n2] }
fun plus [n1, n2: Int] : Int { n1 fun/add n2 }
我有两个问题:
1) 这些函数的主体是什么意思? (好像一个叫另一个!谁能解释一下这个工具是怎么添加的!?)
2) Alloy中的有限整数(即Int)是否有公理化定义?
我想看看是否有任何一组公理将 Int 定义为自然数的有限子集,即 0 =< Int <= Max。 Alloy 中是否有这样的东西,或者它只是在这些看似伪造的函数的幕后使用普通整数。(根据后一种说法,我假设函数体是伪造的,这可能部分回答了我的第一个问题! )
要找到最大整数,您应该搜索位宽。当您在 运行 语句中指定 Int 范围时,您指定了位宽。例如,如果您指定
run{} for 3 Int
你会得到大到 3 小到 -4 的整数。
一般规则是 (2^x-1)-1 用于正数,(2^x-1) 用于负数,其中 X 是 Int 的范围。
我猜 util/integer 中的库是处理 Alloy
中棘手的 Int 语义的助手
this/plus
只是 "calls" 在同一个文件中定义的 plus
函数 (integer.als
);另一方面,fun/add
调用内置的 add
函数,它是 Alloy 实现的一部分,不能定义为库。内置的add
函数实现了用二进制补码表示的两个整数的二进制加法,这在Alloy语言级别是做不到的。
Alloy 中没有整数的公理定义。 Alloy 显式枚举位宽内的所有整数并将它们添加到 Alloy 宇宙(连同所有其他原子)
我查看了 Alloy 中的 Int 实现(即 util 目录中的 integer.als
文件),我想出了以下表达式(除了许多其他人)我无法理解:
fun add [n1, n2: Int] : Int { this/plus[n1, n2] }
fun plus [n1, n2: Int] : Int { n1 fun/add n2 }
我有两个问题:
1) 这些函数的主体是什么意思? (好像一个叫另一个!谁能解释一下这个工具是怎么添加的!?)
2) Alloy中的有限整数(即Int)是否有公理化定义?
我想看看是否有任何一组公理将 Int 定义为自然数的有限子集,即 0 =< Int <= Max。 Alloy 中是否有这样的东西,或者它只是在这些看似伪造的函数的幕后使用普通整数。(根据后一种说法,我假设函数体是伪造的,这可能部分回答了我的第一个问题! )
要找到最大整数,您应该搜索位宽。当您在 运行 语句中指定 Int 范围时,您指定了位宽。例如,如果您指定
run{} for 3 Int
你会得到大到 3 小到 -4 的整数。 一般规则是 (2^x-1)-1 用于正数,(2^x-1) 用于负数,其中 X 是 Int 的范围。
我猜 util/integer 中的库是处理 Alloy
中棘手的 Int 语义的助手this/plus
只是 "calls" 在同一个文件中定义的plus
函数 (integer.als
);另一方面,fun/add
调用内置的add
函数,它是 Alloy 实现的一部分,不能定义为库。内置的add
函数实现了用二进制补码表示的两个整数的二进制加法,这在Alloy语言级别是做不到的。Alloy 中没有整数的公理定义。 Alloy 显式枚举位宽内的所有整数并将它们添加到 Alloy 宇宙(连同所有其他原子)