exercise this code can re-ask question multiple times implement this code so that it only asks question once and remembers the answer also implement function to forget the answers exercise what search method is this usingimplement the search interface so that it can use aor other searching methods define an admissible heuristic that is not always debugging and explanation here we modify the top-down procedure to build proof tree than can be traversed for explanation and debugging prove_atom(kb,atomreturns proof for atom from knowledge base kbwhere proof is pair of the atom and the proofs for the elements of the body of the clause used to prove the atom prove_body(kb,bodyreturns list of proofs for list body from knowledge basekb the indent is used when displaying the code (and doesn' need to have non-default valuelogicexplain py -explaining proof procedure for definite clauses from logicproblem import yes for asking the user def prove_atom(kbatomindent="")"""returns pair (atom,proofswhere proofs is the list of proofs of the elements of body of clause used to prove atom ""kb display( ,indent,'proving',atomif atom in kb askablesif yes(input("is "+atom+true"))return (atom,"answered"elsereturn "failelsefor cl in kb clauses_for_atom(atom)kb display( ,indent,"trying",atom,'<-',join(cl body)pr_body prove_body(kbcl bodyindentif pr_body !"fail"return (atompr_bodyreturn "fail def prove_body(kbans_bodyindent="")"""returns proof tree if kb |ans_body or "failif there is no proof ans_body is list of atoms in body to be proved ""proofs [for atom in ans_bodyproof_at prove_atom(kbatomindent+"if proof_at ="fail"return "failfail if any proof fails elseversion june