cleaned up implementation and refactored 'symmetrical' specification