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| _]), !.
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,
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.
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