Ich arbeite an einem Prolog-Algorithmus, der einen "Swap" auf einer Liste durchführen wird.Prolog Type Fehler
Beispiel:
Input: [1,2,3,4] -> Output: [3,4,1,2] Input: [1,2,3,4,5] -> Ausgabe: [4,5,3,1,2]
Die erste Hälfte und die zweite Hälfte der Liste tauschen die Plätze, wenn es eine ungerade Zahl gibt, behält das mittlere Element seine Position bei. Ich habe mit einem Algorithmus kommen, aber ich erhalte eine Fehlermeldung:
?- swap([1,2,3,4],L).
ERROR: length/2: Type error: `integer' expected, found `round(4/2)'
Mein Code ist wie folgt:
swap(L, S) :-
length(L, Length),
reverse(L, L2),
mixing(L, Length, A),
trim(L2, Length/2 , B),
append(A,B,S).
trim(L,N,S) :-
length(P,N),
append(P,S,L).
mixing(L, Length, A) :-
( mod(Length, 2) == 0
-> trim(L, round(Length/2), A)
; trim(L, round(Length/2), A)
).
Das Problem ist, dass in ‚Mischen‘, wenn ich trim (L nennen, Runde (Länge/2), A) der Typ ist nicht ganzzahlig? Ich verstehe, dass Länge/2 keine Ganzzahl ist (am wahrscheinlichsten ein Gleitkomma) und ich dachte, rund wäre äquivalent zu Ganzzahl (Ausdruck), die rundet und den Datentyp in eine ganze Zahl transformiert. Ich habe auch versucht, runde mit dem truncate (Ausdruck) und Integer (Ausdruck) zu ersetzen, aber ich erhielt die gleichen Fehler. Kann jemand erklären, was ich falsch mache?
Ihre vorgeschlagene Implementierung von 'swap/2' macht nicht das, was das OP will. – lurker
Ich bin neu in Prolog im Allgemeinen, also nicht super klar auf all die Wortspiele. Danke für die Klärung des Typproblems. Ich bin immer noch in einer imperativen Denkweise der Programmierung gefangen. Es macht Sinn, dass ich ein Prädikat verwenden müsste, um den Wert zu erhalten und dann wieder einstecken. Auch danke für den Code-Vorschlag. Können Sie die letzte Zeile erklären? –
@lurker: Oh, in der Tat nicht! Stellt sich heraus, ich kann nicht lesen. – Amadan