Wissenschaft
Copyright © 2024 Jiri Kriz, www.nosco.ch

6    Eingebaute Prädikate

Lösung der Aufgaben

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( '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

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