Prolog - Wie überprüft man, ob eine Liste bestimmte Elemente enthält?

8

Ich probiere zum ersten Mal Prolog aus und habe ein wenig Schwierigkeiten mit Listen.

Sagen wir, ich habe eine Liste von Elementen. Ich möchte überprüfen, ob die Liste folgende Elemente enthält:

Alle: A1, A2, A3, A4, A5

Einer von: B1, B2, B3, B4

Zwei von: C1, C2, C3, C4, C5, C6

Zum Beispiel erfüllt [A1, A2, B2, C1, A3, A4, C4, A5] die Anforderungen und [A2, A1, C1, B1, A3, A4] nicht.

Wie hätte ich etwas schreiben sollen, das Ja / Wahr zurückgibt, wenn eine Liste die Anforderungen erfüllt und ansonsten Nein / Falsch? Ähnlich, wie wäre es mit dem Schreiben von etwas, das die fehlenden Werte aus der Liste zurückgibt, um die Anforderungen zu erfüllen?

    
sanNg 03.03.2011, 23:48
quelle

1 Antwort

18

Du hast viele Fragen gestellt! Lassen Sie mich mit einigen Prädikaten beginnen, die die meisten Ihrer Anforderungen erfüllen.

Lassen Sie uns zuerst den Fall untersuchen, in dem alle Einträge einer Liste auch in der anderen Liste sind:

%Vor%

Diese einfache Rekursion verwendet das bekannte Prädikat member / 2 , um zu überprüfen, ob jeder Eintrag in der durch das erste Argument Teilmenge / 2 angegebenen Liste ebenfalls in der Liste enthalten ist spezifiziert durch das zweite Argument. [Der Einfachheit halber habe ich angenommen, dass Einträge dieser Liste verschieden sind. Eine ausführlichere Version wäre erforderlich, wenn wir überprüfen möchten, ob mehrere Instanzen eines Eintrags der ersten Liste mit mindestens so vielen Instanzen in der zweiten Liste übereinstimmen.]

Okay, wie wäre es mit einem Check, dass (zumindest) einer der ersten Liste auch zu der zweiten Liste gehört? Offensichtlich ist dies ein anderes Prädikat als das obige. Anstelle von alle Elemente in der ersten Liste ist das Ziel, erfüllt zu sein, wenn vorhanden ist ein Element in der ersten Liste, die zur zweiten Liste gehört.

%Vor%

Diese Rekursion schlägt fehl , wenn sie eine leere Liste für das erste Argument erreicht, aber erfolgreich ist, wenn zu irgendeinem Zeitpunkt davor ein Mitglied der ersten Liste gefunden wird, das zur zweiten Liste gehört. [Dieses Prädikat funktioniert auch, wenn mehrere Instanzen eines Elements in einer der beiden Listen vorkommen. Allerdings müssten wir die Logik verfeinern, wenn wir möchten, dass genau ein Element der ersten Liste zu der zweiten Liste gehört, und das würde bedeuten, ob mehrere Instanzen konsistent mit dem exact sind oder ihm widersprechen Zählung von einem.]

Was, wenn wir diese Überprüfung verallgemeinern wollen, um (mindestens) N Punkte der ersten Liste zu verifizieren, sind in der zweiten Liste? Das resultierende Prädikat erfordert ein drittes Argument:

%Vor%

Diese Rekursion arbeitet durch die Liste und dekrementiert das dritte Argument jedes Mal um eins, wenn sich ein Element in der ersten Liste auch in der zweiten Liste befindet, und es wird erfolgreich ausgeführt, sobald die Anzahl auf 0 (oder weniger) reduziert wird. [Auch hier benötigt der Code mehr Arbeit, wenn die Listen Wiederholungen haben können.]

Schließlich fragen Sie nach etwas zu schreiben, das die fehlenden Werte zurückgibt, um die Anforderungen zu erfüllen. Dies ist nicht gut definiert, wenn nach einem oder mehreren Elementen in beiden Listen gesucht wird, da ein "fehlender Wert" eines von mehreren möglichen Elementen sein kann. In dem speziellen Fall, in dem wir darum gebeten haben, dass alle Elemente der ersten Liste zu der zweiten Liste gehören, können die "fehlenden Werte" bestimmt werden (falls vorhanden).

%Vor%

Hier "verschiebt" die Rekursion Elemente aus der ersten Eingangsliste in die dritte Liste der "fehlenden Elemente", wenn und nur wenn sie nicht in der zweiten Liste erscheinen.

Eine letzte Anmerkung zu Ihren Fragen betrifft die Notation. In Prolog-Variablen sind Bezeichner, die mit einem Großbuchstaben oder einem Unterstrich beginnen, so dass die Verwendung von A1, A2 usw. als Punkte auf der Liste auf Schwierigkeiten zusteuert, wenn diese als "Unbekannte" behandelt werden ) unterschiedliche Atome (Konstanten). Der Wechsel zu Kleinbuchstaben würde das lösen.

    
hardmath 04.03.2011 05:26
quelle

Tags und Links