% Logik og sprog, Modul 2, datalogi RUC Henning Christiansen % % % En interaktiv debugger for Prolog ved udvidet Vanilla; % afsnit 11.1 i "Sprog og abstrakte maskiner" % % (c) 2000, Henning Christiansen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Diverse hjūlpere: % % trace_code( Forlūns, Baglūns) % % trace_code( Forlūns ) % % SŒfremt tracing er slŒet til, udfŋres koden % Forlūns ved forlūns udfŋrelse, Baglūns ved backtracking. % Forlūns og Baglūns mŒ kun kunne generere Žn lŋsning og % mŒ ikke fejle - i sŒfald gŒr der skudder-mudder trace_code( For, Bag):- (For ; Bag, fail). trace_code( For):- For. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % En lille snakkesalig dialog % % rewrite_goal_ask_user(A, B):- get0(C), % lūse et tegn som talvūrdi, tomlinie=10 (C = 10 -> true ; skip_line), ( (C=10; [C]="c") -> % creep clause(A,B), trace_code( (write('Try '), write((A:- B)), nl ), (write('Drop '), write((A:- B)), nl)) ; [C]="s" -> % skip B = call(A) ; [C] = "f" -> % fail B = fail ; write('Du kan skrive tom-linie, c, s eller f?'), rewrite_goal_ask_user(A, B) ). % solve( goal ) ... solve(true):- !. solve(fail):- !, fail. solve(call(A)):- !, call(A). solve((A,B)):- !, solve(A), solve(B). solve(A):- trace_code( (write('Enter '), write(A), write(?)), (write('Fail '), write(A), nl)), rewrite_goal_ask_user(A,B), solve(B), trace_code( (write('Succeed '), write(A), nl)).