在河内塔示例here中说明了模块重载机制。它使您可以用Java实现TLA +运算符,以提高模型检查性能。
我一直在努力在TLA +中定义一个有用的哈希函数(不,身份函数对于我的目的不起作用),并且我认为模块重载可能是这样做的方法。哈希函数将接受TLA +对象(例如,一条记录),并在对象的字符串表示形式上使用Java的hashCode()
方法来确定性地得出其哈希值。该值将返回到TLA +规范。
这可能吗? Java覆盖代码是什么样的?是否存在其他模块替代代码示例?
答案 0 :(得分:2)
import tlc2.value.impl.IntValue;
import tlc2.value.impl.Value;
public class TLCHash {
public static Value Hash(Value v) {
return IntValue.gen(v.hashCode());
}
}
------------------------------ MODULE TLCHash ------------------------------
EXTENDS Integers
Hash(val) == CHOOSE n \in Int : TRUE
ASSUME(Hash(<<"a","b","c">>) = Hash(<<"a","b","c">>))
ASSUME(Hash(<<"a","b","c">>) # Hash(<<"c","b","a">>))
ASSUME(Hash({"a","b","c"}) = Hash({"b","c","a", "c"}))
=============================================================================
请注意,TLC对Value#hashCode的实现委托给Value#fingerprint,因此应该可以按照您希望的方式工作(根据我对问题的理解)。另请注意,在1.5.8版中,Value类层次结构已从软件包tlc2.value移至tlc2.value.impl。
https://gist.github.com/lemmy/1eaf4bec8910b25e206d070b0bc80754显示了模块覆盖的实际应用,可能会启发解决方案。最后,TLC built-in standard modules真正将它们转换为标准模块的唯一方面是tlc2.module软件包/命名空间。