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
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).
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