/**
* A contrapositive of a chain is a permutation in which a different literal
* is placed at the front. The contrapositives of a chain are logically
* equivalent to the original chain.
*
* @return a list of contrapositives for this chain.
*/
public List <Chain> getContrapositives()
{
List <Chain> contrapositives = new List <Chain>();
List <Literal> lits = new List <Literal>();
for (int i = 1; i < literals.Count; i++)
{
lits.Clear();
lits.Add(literals[i]);
lits.AddRange(literals.Take(i));
lits.AddRange(literals.GetRange(i + 1, literals.Count));
Chain cont = new Chain(lits);
cont.setProofStep(new ProofStepChainContrapositive(cont, this));
contrapositives.Add(cont);
}
return(contrapositives);
}