#NEWLINE# def ast_match( x , y , placeholders , subst ) : #NEWLINE# #INDENT# if ( type ( x ) is not type ( y ) ) : #NEWLINE# #INDENT# return False #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# if ( is_variable ( y ) or is_constant ( y ) ) : #NEWLINE# #INDENT# if ( y in placeholders ) : #NEWLINE# #INDENT# if ( y in subst ) : #NEWLINE# #INDENT# return ( x == subst [ y ] ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# subst [ y ] = x #NEWLINE# return True #NEWLINE# #UNINDENT# #UNINDENT# return ( x == y ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# if isinstance ( y , lg . Apply ) : #NEWLINE# #INDENT# if ( x . rep != y . rep ) : #NEWLINE# #INDENT# return False #NEWLINE# #UNINDENT# return ast_match_lists ( x . args , y . args , placeholders , subst ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# if isinstance ( y , Literal ) : #NEWLINE# #INDENT# if ( x . polarity != y . polarity ) : #NEWLINE# #INDENT# return False #NEWLINE# #UNINDENT# return ast_match ( x . atom , y . atom , placeholders , subst ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# if hasattr ( y , 'args' ) : #NEWLINE# #INDENT# return ast_match_lists ( x . args , y . args , placeholders , subst ) #NEWLINE# #UNINDENT# #UNINDENT# #UNINDENT# #UNINDENT# #UNINDENT# return False