path_contains_operation_call(path(S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call([H|T],Pat) :- !, member(S,[H|T]), path_contains_operation_call(S,Pat).
path_contains_operation_call(parallel(L),Pat) :- !, member(S,L), path_contains_operation_call(S,Pat).
path_contains_operation_call(sequence(A,B),Pat) :- !, member(S,[A,B]), path_contains_operation_call(S,Pat).
path_contains_operation_call(assertion(S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(pre(_,S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(choice(_,S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(if(_,S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(select(_,S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(let(S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(any(_,S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(var(_,S),Pat) :- !, path_contains_operation_call(S,Pat).
path_contains_operation_call(operation_call(Name,_ResultNames,Paras,ReturnValues, Path),Pat) :- !,
%write(opcall(Name)),nl,
(Pat = matchop(SrcNode,bop(Name,_NumberArgs,_NumberResults,ArgPatterns,ResPatterns)),
Op =.. [Name|Paras],
check_bop_arg_patterns(ArgPatterns,SrcNode,State,Op), % State instantiated upon demand
check_bop_res_patterns(ResPatterns,SrcNode,State,ReturnValues)
-> true
; path_contains_operation_call(Path,Pat)).