package body Permutations is function Is_Permutation ( p : Permutation ) return boolean is begin for i in p'range loop if ((p(i) = 0) or else (p(i) < -p'last) or else (p(i) > p'last)) then return false; else for j in p'first..(i-1) loop if ((p(i) = p(j)) or else (p(i) = -p(j))) then return false; end if; end loop; end if; end loop; return true; end Is_Permutation; function Equal ( p1,p2 : Permutation ) return boolean is begin if (p1'first /= p2'first) or else (p1'last /= p2'last) then return false; else for i in p1'range loop if p1(i) /= p2(i) then return false; end if; end loop; return true; end if; end Equal; function "*" ( p1,p2 : Permutation ) return Permutation is r : Permutation(p1'range); begin for i in r'range loop if p2(i) >= 0 then r(i) := p1(p2(i)); else r(i) := -p1(-p2(i)); end if; end loop; return r; end "*"; function inv ( p : Permutation ) return Permutation is r : Permutation(p'range); begin for i in r'range loop if p(i) >= 0 then r(p(i)) := i; else r(-p(i)) := -i; end if; end loop; return r; end inv; end Permutations;