SWI Prolog
2007-12-02 16:42
Fred
Nach Jahren der Abstinenz möchte ich mal wieder ein bischen Prolog benutzen. Hab auch schon mein erstes Prädikat fertig implementiert, dass das letzte Element einer Liste findet [23] Die Aufgabe ist übrigens aus P-99: Ninety-Nine Prolog Problems.
Frage 1: Gibt es eine Möglichkeit, eine lange Beispiel-Liste unter einem Namen abzuspeichern, so dass ich nicht immer [a,b,c,d,e] zum Testen eingeben muss sondern z.B. einfach nur L?
Frage 2: Kann ich Testanfragen direkt in der pl-Datei speichern, so dass sie beim Öffnen der pl-Datei beantwortet werden?
Hab jetzt die ersten neun Aufgaben gelöst. Das macht ja richtig Spaß [28]
Frage 1: Gibt es eine Möglichkeit, eine lange Beispiel-Liste unter einem Namen abzuspeichern, so dass ich nicht immer [a,b,c,d,e] zum Testen eingeben muss sondern z.B. einfach nur L?
Frage 2: Kann ich Testanfragen direkt in der pl-Datei speichern, so dass sie beim Öffnen der pl-Datei beantwortet werden?
Hab jetzt die ersten neun Aufgaben gelöst. Das macht ja richtig Spaß [28]
% P01 (*) Find the last element of a list.
my_last(X, [X]).
my_last(X, [_ | T]) :-
my_last(X, T).
% P02 (*) Find the last but one element of a list.
my_last_but_one(X, [X, _]).
my_last_but_one(X, [_ | T]) :-
my_last_but_one(X, T).
% P03 (*) Find the K'th element of a list.
my_element_at(X, [X | _], 1).
my_element_at(X, [_ | T], K) :-
my_element_at(X, T, I), K is I+1.
% P04 (*) Find the number of elements of a list.
my_number_of_elements(0, []).
my_number_of_elements(K, [_ | T]) :-
my_number_of_elements(I, T), K is I+1.
% P05 (*) Reverse a list.
my_reverse([], []).
my_reverse([H | T], Y) :-
my_reverse(T, A),
my_append(H, A, Y).
% append an element to a list
my_append(X, [], [X]).
my_append(X, [H | T], [H | Y]) :-
my_append(X, T, Y).
% P06 (*) Find out whether a list is a palindrome.
my_palindrome(X) :- my_reverse(X, X), !.
% P07 (**) Flatten a nested list structure.
my_flatten([], []).
my_flatten([H | T], Z) :-
(
is_list(H)
-> (
my_flatten(H, X),
append(X, Y, Z)
)
; Z = [H | Y]
),
my_flatten(T, Y).
% P08 (**) Eliminate consecutive duplicates of list elements.
compress([], []).
compress([X, X | Xs], Ys) :- compress([X | Xs], Ys), !.
compress([X | Xs], [X | Ys]) :- compress(Xs, Ys).
% P09 (**) Pack consecutive duplicates of list elements into sublists.
pack([], []).
pack([X | Xs], [Y | Ys]) :- pack(X, [X | Xs], Y, Z), pack(Z, Ys).
pack(X, [X | Xs], [X | Ys], Z) :- pack(X, Xs, Ys, Z), !.
pack(_, Z, [], Z).