DE → EN A-AA+ Sitemap Suche

# 6    Eingebaute Prädikate

## 6.1    Prädikate höherer Ordnung

``````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

## 6.2    Memorisieren

``````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

## 6.3    Interaktion mit dem Benutzer

``````d( X, Y, D) :-
dist( X, Y, D).
d( X, Y, D) :-
dist( Y, X, D).

distanzen :-
nl, write( 'Abschluss: exit'),
repeat,
nl, write( 'Eingabe: '),
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) :-

nl,
write( 'Distanz zwischen '),
write( S1),
write( ' und '),
write( S2),
nl,
write( 'ist mir leider unbekannt.'),
nl,
write( 'Bitte sagen Sie sie mir: '),

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, DR) :-
nl,
write( '*** Ungueltige Eingabe ***'),
``````

Back to example 6.3

## 6.4    Zähler

``````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

## 6.5    Umwandlung von Fakten in Listenargumente

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

/* Das folgende setof sortiert auch die Elemente der Liste S */

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