Künstliche Intelligenz und Prolog
Copyright © 2019 Jiri Kriz, www.nosco.ch

12    Property-based Shell, Strukturbasierte Diagnose

Lösung der Aufgaben

12.1    Property-based Shell

/* shell */

define_operators:-
    op( 910, xfx, :), 
    op( 930, xfy, --).

?- define_operators.

init :- 
    retractall( told( _, _)), !.

solve( G, X) :- 
    (object( G, question, Q) -> get_answer( G, A)),
    solve1( G, A, X).

solve1( G, A, X) :-     
    object( G, reasons, Rs),
    (var( A) -> member( G1, Rs); member( A : G1, Rs)),
    solve2( G, G1, X).

solve2( G, true, G).
solve2( G, G1, X) :- 
    solve( G1, X).

get_answer( Object, A) :- 
    told( Object, A), !.
get_answer( Object, A) :- 
    ask( Object, A), 
    asserta( told( Object, A)), !.

ask( Object, Answer) :-
    object( Object, question, Question),
    object( Object, answers, Answers),
    nl, write( Question), 
    write_list( Answers), 
    nl, read( Answer), !.

object( Object, Attribute, Value) :-
    Object -- Attrs,
    obj( Attribute, Value, Attrs), !.

obj( A, V, A : V).
obj( A, V, A : V -- AVs).
obj( A, V, A1 : V1 -- AVs) :- 
    obj( A, V, AVs).

write_list( [ X| Xs]) :- 
    nl, write( X), 
    write_list( Xs).
write_list( [ ]).

Back to example 12.1

12.2    Strukturbasierte Diagnose

diagnose :-
    init, 
    symptom( S), 
    solve( S, D), 
    object( D, explanation, E), 
    nl, write( E),
    backtrack.
diagnose :- 
    nl, 
    write(' no (more) faults found').

backtrack :- 
    nl, nl, 
    write( 'further solutions ? [y/n] '), 
    read( n).

/* Knowledge Base */

symptom( velo).

velo
-- question: 'Welche Probleme haben Sie mit Ihrem Velo?'
-- answers: [ 1: 'Fahreigenschaften', 2: 'Lampe']
-- reasons: [ 1: fahren, 2 : elektrik] .

fahren
-- question: 'Welche Probleme haben Sie bei der Fahrt?'
-- answers: [ 1: 'schwer, unregelmaessig', 2: 'Gerauesche', 
    3: 'Bremsen']
-- reasons: [ 1: raeder, 2: antrieb, 3: bremsen] .

raeder
-- question: 'Gibt es Probleme mit den Raedern?'
-- answers: [ 1: 'Reifen platt', 2: 'Nicht ausgewuchtet']
-- reasons: [ 1: platte_reifen, 2: auswuchtung] .

platte_reifen
-- reasons: [ luft, ventil, loch] .

luft
-- question: 'Pumpen Sie den Reifen. Ist er jetzt gut?'
-- answers: [ 1: ja, 2: nein]
-- reasons: [ 1: true]
-- explanation: 'Der Reifen hatte zu wenig Luft. Sonst OK'.

ventil
-- question: 'Ist das Ventil defekt?'
-- answers: [ 1: ja, 2: nein]
-- reasons: [ 1: true]
-- explanation: 'Das Ventil war defekt. Ersetzen Sie es.'.

loch
-- question: 'Ist ein Loch im Schlauch?'
-- answers: [ 1: ja, 2: nein]
-- reasons: [ 1: true]
-- explanation: 'Es war ein Loch im Schlauch. Kleben Sie es.'.

antrieb
-- question: 'Ist die Kette rostig oder die Schaltung defekt ?'
-- answers: [ 1: ja, 2: nein]
-- reasons: [ 1: true]
-- explanation: 'Kette oelen oder Schaltung ersetzen.'.

bremsen
-- question: 'Ist das Kabel zerrissen oder die Bremskloetze defekt ?'
-- answers: [ 1: ja, 2: nein]
-- reasons: [ 1: true]
-- explanation: 'Bringen Sie das Velo zum Fachmann.'.

elektrik
-- question: 'Ist Gluehbirne defekt oder Dynamokontakt schlecht ?'
-- answers: [ 1: ja, 2: nein]
-- reasons: [ 1: true]
-- explanation: 'Reparieren Sie entsprechend.'.

auswuchtung
-- question: 'Ist die Auswuchtung schlecht ?'
-- answers: [ 1: ja, 2: nein]
-- reasons: [ 1: true]
-- explanation: 'Bringen Sie das Velo zum Fachmann.'.

Back to example 12.2