abolish( F, A) :-
functor( Term, F, A),
retractall( Term).
retractall( X) :-
retract( X), fail.
retractall( X) :-
retract( X :- Y), fail.
retractall( _).
filter( P, [ X| Xs], [ X| Ys]) :-
F =.. [P, X],
call( F), !,
filter( P, Xs, Ys).
filter( P, [ X| Xs], Ys) :-
filter( P, Xs, Ys).
filter( P, [], []).
Back to example 6.1
fibo( 1, 1).
fibo( 2, 1).
fibo( N, F) :-
N > 2,
N1 is N - 1,
N2 is N - 2,
fibo( N1, F1),
fibo( N2, F2),
F is F1 + F2,
asserta( fibo( N, F) :- !).
Back to example 6.2
d( X, Y, D) :-
dist( X, Y, D).
d( X, Y, D) :-
dist( Y, X, D).
distanzen :-
nl, write( 'Eingabe: d( Stadt1, Stadt2)'),
nl, write( 'Abschluss: exit'),
repeat,
nl, write( 'Eingabe: '),
read( Input),
process_input( Input), !.
process_input( exit) :- !.
process_input( d( S1, S2)) :-
distance( S1, S2, D), fail.
output( S1, S2, D) :-
nl,
write( 'Distanz zwischen '),
write( S1),
write( ' und '),
write( S2),
write( ' ist '),
write( D).
distance( S1, S2, D) :-
d( S1, S2, D),
output( S1, S2, D), !.
distance( S1, S2, D) :-
ask_user( S1, S2, D), !.
ask_user( S1, S2, D) :-
nl,
write( 'Distanz zwischen '),
write( S1),
write( ' und '),
write( S2),
nl,
write( 'ist mir leider unbekannt.'),
nl,
write( 'Bitte sagen Sie sie mir: '),
read( DR),
process_answer( S1, S2, D, DR).
process_answer( S1, S2, D, DR) :-
number( DR), !,
D = DR,
assert( dist( S1, S2, D)),
nl,
write( 'Danke. Ich bestaetige:'),
output( S1, S2, D).
process_answer( S1, S2, D, nein).
process_answer( S1, S2, D, eof).
process_answer( S1, S2, D, DR) :-
nl,
write( '*** Ungueltige Eingabe ***'),
ask_user( S1, S2, D).
Back to example 6.3
init( C, V) :-
retractall( counter( C, _)),
assert( counter( C, V)), !.
get( C, V) :-
counter( C, V).
inc( C) :-
retract( counter( C, N)),
N1 is N + 1,
assert( counter( C, N1)), !.
dec( C) :-
retract( counter( C, N)),
N1 is N - 1,
assert( counter( C, N1)), !.
del( C) :-
retract( counter( C, _)).
Back to example 6.4
bagof( X, P, B) :-
asserta( found( mark)),
call( P),
asserta( found(X)),
fail.
bagof( _, _, B) :-
collect( [], B).
collect( B, BB) :-
retract( found( X)),
( X == mark
-> BB = B
; collect( [ X| B], BB)
), !.
setof( X, P, S) :-
bagof( X, P, L),
sort1( L, S).
sort1( [], []).
sort1( [ X1| Xs], Y) :-
sort1( Xs, Ys),
insert1( X1, Ys, Y).
insert1( X, [], [ X]).
insert1( X, [ Y1| Ys], [ X, Y1| Ys]) :-
X < Y1.
insert1( X, [ Y1| Ys], [ Y1| Zs]) :-
X > Y1,
insert1( X, Ys, Zs).
insert1( X, [ X| Ys], [ X| Ys]).
Back to example 6.5