get_operators_post_symmetry_reduction_for_pair((ComponentName1,ComponentName2),Solution,LocationVarsOut,PairReduction) :-
% get the output location variables that are mapped to left and right input of the component
% the components are symmetric and thus have two inputs
get_location_var_from_list(ComponentName1,left_input,LocationVarsOut,b(identifier(C1LeftLocationVarName),_,_)) ,
get_mapped_output_location(C1LeftLocationVarName,Solution,C1LeftMappedOutputLocationName) ,
get_location_var_from_list(ComponentName1,right_input,LocationVarsOut,b(identifier(C1RightLocationVarName),_,_)) ,
get_mapped_output_location(C1RightLocationVarName,Solution,C1RightMappedOutputLocationName) ,
C1LeftMappedOutputLocationName \= C1RightMappedOutputLocationName , % not the same operator mapped to both locations, otherwise we may loose solutions
% create inequality with the input locations of the equivalent symmetric component
get_location_var_from_list(ComponentName2,left_input,LocationVarsOut,C2LeftLocationVar) ,
get_location_var_from_list(ComponentName2,right_input,LocationVarsOut,C2RightLocationVar) ,
create_texpr(not_equal(b(identifier(C1LeftMappedOutputLocationName),integer,[]),C2RightLocationVar),pred,[],C1LOutC2RInReduction) ,
create_texpr(not_equal(b(identifier(C1RightMappedOutputLocationName),integer,[]),C2LeftLocationVar),pred,[],C1ROutC2LInReduction) ,
create_texpr(conjunct(C1LOutC2RInReduction,C1ROutC2LInReduction),pred,[],PairReduction).
get_operators_post_symmetry_reduction_for_pair(_,_,_,b(truth,pred,[])).