使用模块重载在 TLA+ 中实现哈希函数

Use module overloading to implement a hash function in TLA+

汉诺塔示例中解释了模块重载机制here。它使您能够在 Java 中实施 TLA+ 运算符,以提高模型检查性能。

为了在 TLA+ 中定义一个有用的散列函数,我努力了一段时间(不,身份函数对我的目的不起作用),我认为模块重载可能是实现它的方法。散列函数将接受一个 TLA+ 对象(例如一条记录),并在对象的字符串表示上使用 Java 的 hashCode() 方法来确定性地导出其散列值。该值将返回给 TLA+ 规范。

这可能吗? Java 覆盖代码会是什么样子?是否存在任何其他模块覆盖代码示例?

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,因此应该按照您希望的方式工作(根据我对您问题的理解)。另请注意,Value class 层次结构已从包 tlc2.value 移至 tlc2.value.impl 版本 1.5.8.

https://gist.github.com/lemmy/1eaf4bec8910b25e206d070b0bc80754 shows a real-world application of module overwrites and might inspire a solution. Lastly, the only aspect of TLC's built-in standard modules 实际上将它们变成标准模块的是 tlc2.module package/namespace.