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

9    Ein Informationssystem

Lösung der Aufgaben

/* Shell */

init :- 
    init( 0).

init( N) :-
    ( object( N, _, _, _) 
    -> set_tr( [ N]), show( N)
    ; write( 'object does not exist'), nl
    ), !.
     
go( N) :-
    tr( []), !, 
    init( N).

go( N) :-
    tr( [ N| _]), !. /* already there, do nothing */

go( N) :-
    ( object( N, _, _, _) 
    -> inc_tr( N), show( N)
    ; write( 'object does not exist'), nl
    ),  !.
  
back :-
     dec_tr( N), show( N), !.

back( N) :-
    tr( Trace),
    ( member( N, Trace, Trace0) 
    -> set_tr( Trace0), show( N)
    ;  write( 'object not in trace'), nl
    ),  !.
     
show( N) :-
    object( N, Name, Text, Refs),
    home, /* cursor (1,1) or new lines */
    write( Name), nl,
    write( 'Id = '), write( N), nl, nl,
    write_text( Text), nl,
    ( Refs \= [] -> write( 'Siehe auch:'), 
    nl, write_objects( Refs)
    ), !.
     
trace :-
    home, tr( Trace), write_objects( Trace),
    !.
     
write_text( [ T| Ts]) :- 
    write( T), nl,
    write_text( Ts).
write_text( []) :- !.

write_objects( [ N| Ns]) :- 
    object( N, Name, T, R),
    write( N - Name), nl,
    write_objects( Ns).
write_objects( [ ]) :- !.

set_tr( T) :-
    ( retract( tr( _)); true), !, 
    assert( tr( T)).
 
inc_tr( N) :-
    ( retract( tr( T)); T = []), !, 
    assert( tr( [ N| T])).


dec_tr( N2) :-
    retract( tr( [ N1, N2| T])), 
    assert( tr( [ N2| T])), !.

home :- nl, nl, nl. /* auf Macintosh */     

/* Wissensbank: ein Teil */
    
object( 
1, 'Atom',
['kleinstes Teilchen eines chem. Elementes,',
'das für dessen chem. und physik. Eigenschaften verantwortlich ist.',
'Es besteht aus einem Atomkern und',
'einer ihr umgebenden Hülle aus Elektronen.'],
[ 2, 3, 4]).

object( 
2, 'Atomkern',
['befindet sich im Zentrum des Atoms.',
'Er besteht aus Nukleonen, d.h. Protonen und Neutronen.', 
'Protonen sind positiv geladen, Neutronen haben keine el. Ladung.',
'Atome, die sich nur in der Azahl der Neutronen unterscheiden', 
'heissen Isotope.'],
[ 4]).

object( 
3, 'Elektron',
['negativ geladenes, stabiles Elementarteilchen ...'],
[1]).

object( 
4, 'Kernenergie',
['allg. die Bindungsenergie eines Atomkerns,',
'im engeren Sinne die bei Kernreaktionen im Kernreaktor',
'freiwerdende, resp. nutzbar gemachte Energie.'],
[]).

Back to example 9.0