Teilen Sie eine Liste in zwei Hälften

8

Ich muss Divide definieren, damit List [1,2,3,4,5] in:

aufgeteilt wird %Vor%

Ich bekomme einen Fehler, der sagt "Arguments are not sufficiently instantiated" , und ich weiß nicht genug über die Sprache, um herauszufinden, was mein Problem ist, oder ob mein Design sogar richtig ist. Jede Anleitung wäre willkommen.

Also hier ist was ich bisher habe:

%Vor%     
bdmflyer 18.11.2011, 00:34
quelle

7 Antworten

8

Geben wir dem Prädikat einen relationalen Namen: list_half_half/3

%Vor%

length/2 und append/3 sind in praktisch allen aktuellen Prologs vordefiniert.

Das ist GNU Prolog:

%Vor%     
false 18.11.2011, 00:55
quelle
5

Dies ist die effizienteste Lösung, die Ihren Spezifikationen für die meisten Prolog-Implementierungen entspricht:

%Vor%

Wenn es Ihnen nichts ausmacht, welche Elemente in die Unterlisten eingehen, sofern sie ähnlich lang sind (wie in der Lösung von Konstantin Weitz), dann können Sie verwenden:

%Vor%     
salva 18.11.2011 08:38
quelle
4

append ist ein vordefiniertes Prädikat, also könnte das Problem sein: Ссылка

Sie haben auch nie 'N' in LängeI definiert - Sie müssen die leere Liste als 0 setzen, nicht N / Es gibt wahrscheinlich auch eine Größenfunktion

Der Unterstrich teilt Prolog mit, dass uns dieses Bit in dieser Prädikatdefinition egal ist.

So etwas sollte funktionieren

%Vor%     
Philip Whitehouse 18.11.2011 00:52
quelle
2

Sie müssen die Größe nicht überprüfen. Mach es einfach so:

%Vor%     
Konstantin Weitz 18.11.2011 00:56
quelle
2

Sicherlich ist der Effekt dieses Codes ( lengthIs(L2, M) < lengthIs(L1,N)/2 -> ... ) nicht das, was Sie erwarten: Er vergleicht keine Zahlen, sondern Begriffe. Du solltest es so schreiben:

%Vor%

Ein anderer Tippfehler wie der Fehler: Die erste Klausel von lengthIs / 2 sollte

lesen %Vor%     
CapelliC 18.11.2011 08:29
quelle
0

Eine andere Antwort, verwendet Backtracking viel, ist aber nicht sehr performant. append und length werden als vordefiniert angenommen:

%Vor%

Oh, Entschuldigung, ich habe gerade gesehen, dass dies eine Art Neuformulierung der Antwort von Philip Whitehouse ist.

    
Patrick J. S. 18.11.2011 17:46
quelle
0

So habe ich es gemacht. Fast keine Einbauten:

%Vor%     
Nicholas Carey 18.11.2011 18:21
quelle

Tags und Links