Prolog: Liste sortieren

  • Möchte Prolog dazu bringen, aus einer gegebenen Liste eine sortierte zu ermitteln:

    getfirst([H|T], H).
    issmaller(X,Y) :- Y >= X.
    issort([]).
    issort([H|[]]).
    issort([H|T]) :- getfirst(T,H2), issmaller(H,H2), issort(T).
    countelem([],E,0).
    countelem([H|T],H,N) :- N is N2 + 1, countelem(T,H,N2).
    countelem([H|T],E,N) :- countelem(T,E,N).
    ispermut([],[]).
    ispermut([H1|T1],[H2|T2]) :- countelem([H1|T1],H1,N), countelem([H2|T2],H1,N), ispermut(T1,T2).
    dosort(L1,L2) :- issort(L2), ispermut(L1, L2).

    Die Relation countelem bereitet Schwierigkeiten. Erhalte die Meldung:
    ERROR: is/2: Arguments are not sufficiently instantiated

    Die Argumente sind nicht ausreichend instanziiert. Was bedeutet das?



  • es gibt verschiedene methoden Listen zu sortieren, mit welche willt u das machen??#
    außerdem was für listen willst du sortieren und nach welchen kriterien...

    ein beispiel von mir :
    % dieser programm sortiert listen von integerzahlen.
    mysort([],End) :- End = [].
    mysort([Pivot|List],End) :-
    findall(E, ( member(E,List), E > Pivot ), Right), % finde rechte Seite
    erase(Right,List,Left), % finde linke Seite
    mysort(Left,EndLeft), quicksort(Right,EndRight), % sortiere linke und rechte Seiten
    EndList = [EndLeft,Pivot,EndRight], flatten(EndList,End). % füge Listen zusammen!

    erase(Erase,List,End) :-
    findall(X,(member(X,List), not(member(X,Erase))),End).

    ist angelehnt an dem quicksort verfahren...

    grüß
    EDdie

  • Also so funktioniert es zumindest:

    Was das Problem angeht, diese Zeile ist auf jeden Fall problematisch:

    Code
    countelem([H|T],H,N) :- N is N2 + 1, countelem(T,H,N2).


    N2 existiert noch nicht, und du willst N die N2+1 zuweisen, das geht nicht, du musst es so machen:

    Code
    countelem([H|T],H,N) :- countelem(T,H,N2), N is N2 + 1.
  • Also so funktioniert es zumindest:

    ....so funktioniert bei mir aber nicht...

    Code
    ?- mysort([2,5,1,3,6,4],R).
    R = [1, 2, 5, 3, 6, 4] ;
    false.

    linke und rechte Seite muss noch geordnet werden...
    habs so erweitert...