Here is a version which verifies
http://rise4fun.com/Dafny/ZNO7
http://rise4fun.com/Dafny/ZNO7
lemma trans(a:seq<int>,a':seq<int>,a'':seq<int>, i:int)
requires 0 <= i < |a|;
requires |a| == |a'| == |a''|;
requires perm(a[..i],a'[..i]);
requires a[i..]==a'[i..];
requires perm(a'[..i+1],a''[..i+1]);
requires a'[i+1..]==a''[i+1..];
ensures perm(a[..i+1],a''[..i+1]);
{
assert a[i] == a'[i];
assert multiset(a[..i]) == multiset(a'[..i]);
assert multiset(a'[..i+1]) == multiset(a''[..i+1]);
assert multiset(a[..i])+multiset{a[i]} == multiset(a'[..i])+multiset{a'[i]};
MultiSetSequenceDist(a,i);
MultiSetSequenceDist(a',i);
assert multiset(a[..i+1]) == multiset(a'[..i+1]);
assert multiset(a'[..i])+multiset{a'[i]} == multiset(a'[..i+1]) == multiset(a''[..i+1]);
assert multiset(a[..i+1])==multiset(a''[..i+1]);
}
lemma MultiSetSequenceDist(a:seq<int>,i:int)
requires 0 <= i < |a|;
requires a != [];
ensures multiset(a[..i])+multiset{a[i]} == multiset(a[..i+1])
{
MultiSetSequenceDist'(a[..i],a[i]);
assert multiset(a[..i])+multiset{a[i]} == multiset(a[..i]+[a[i]]);
assert a[..i]+[a[i]] == a[..i+1];
}
lemma MultiSetSequenceDist'(a:seq<int>,i:int)
ensures multiset(a)+multiset{i} == multiset(a+[i])
{ }