internal Symbol[] MkSymbols(string[] names)
{
Contract.Ensures(names == null || Contract.Result<Symbol[]>() != null);
Contract.Ensures(names != null || Contract.Result<Symbol[]>() == null);
Contract.Ensures(Contract.Result<Symbol[]>() == null || Contract.Result<Symbol[]>().Length == names.Length);
Contract.Ensures(Contract.Result<Symbol[]>() == null || Contract.ForAll(Contract.Result<Symbol[]>(), s => s != null));
if (names == null) return null;
Symbol[] result = new Symbol[names.Length];
for (int i = 0; i < names.Length; ++i) result[i] = MkSymbol(names[i]);
return result;
}