Dictionary Dafny反向查找映射

Dictionary Dafny反向查找映射,dictionary,dafny,Dictionary,Dafny,您好,我有一个类似于map的映射,我希望进行反向查找,即从一个值中查找一个键 在Dafny(例如,map.getKey(value))中是否有任何方法可以做到这一点,但还没有文档记录 我在想,一个解决方案可能是反转映射,这样我就可以将map反转为map您可以使用“let-so-that”语句来实现这一点。例如: method Test(m: map<char,int>, val: int) requires exists i :: i in m && m[i]

您好,我有一个类似于
map
的映射,我希望进行反向查找,即从一个值中查找一个键

在Dafny(例如,
map.getKey(value)
)中是否有任何方法可以做到这一点,但还没有文档记录

我在想,一个解决方案可能是反转映射,这样我就可以将
map
反转为
map您可以使用“let-so-that”语句来实现这一点。例如:

method Test(m: map<char,int>, val: int)
    requires exists i :: i in m && m[i] == val;
{
    var i :| i in m && m[i] == val;
    // now use i...
}
方法测试(m:map,val:int)
需要在m中存在i::i&&m[i]==val;
{
变量i:| i在m和m[i]==val;
//现在用我。。。
}
您还可以按如下方式反转贴图(但不需要只进行一次反向查找)

函数方法反转映射(m:map):映射
{
将b | b映射到m中。值::var a:| a映射到m&&m[a]==b;a
}

如果您阅读了上述问题,则原始映射为
map
,因此
InvertMap
函数应接受该映射并返回一个
map
。如果我简单地交换输入和返回类型,我会得到
一个映射理解必须产生一个有限集,但是Dafny的启发式算法无法找出如何为“b”产生一个有界的值集。
function method InvertMap(m: map<char,int>): map<int,char>
{
    map b | b in m.Values :: var a :| a in m && m[a] == b; a
}