Prolog - wie um zu überprüfen, ob eine Liste schließt bestimmte Elemente?
Ich versuche aus Prolog zum ersten mal und bin mit ein wenig Schwierigkeiten bei der Verwendung von Listen.
Sagen, ich habe eine Liste von Elementen. Ich möchte, um zu überprüfen, dass die Liste besteht aus folgenden Elementen:
Alle: A1, A2, A3, A4, A5
Sein: B1, B2, B3, B4
Zwei: C1, C2, C3, C4, C5, C6
Z.B. [A1, A2, B2, C1, A3, A4, C4, A5] erfüllt die Anforderungen und [A2, A1, C1, B1, A3, A4] nicht.
Wie würde ich habe über etwas zu schreiben, dass die Rendite ja/True, wenn eine Liste mit den Anforderungen genügt und Keine/sonst False? In ähnlicher Weise, wie über etwas zu schreiben, das gibt die fehlenden Werte aus der Liste erforderlich, um die Anforderungen zu erfüllen?
InformationsquelleAutor sanNg | 2011-03-03
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie gefragt, eine Menge Fragen! Lassen Sie mich Ihnen den Einstieg mit einigen Prädikaten, die zu lösen die meisten Ihrer Anforderungen.
Zuerst packen wir den Fall zu prüfen, dass alle Einträge von der einen Liste auch in der anderen Liste:
Diese einfache Rekursion macht Gebrauch von der bekannten Mitglied/2 Prädikat zu überprüfen jeden Eintrag in der Liste durch das erste argument von Teilmenge/2 ist auch in der Liste angegeben durch das zweite argument. [Einfachheit halber habe ich angenommen, dass die Einträge dieser Liste sind Verschieden. Eine ausführlichere version wäre erforderlich, wenn wir wollten, um zu überprüfen, mehrere Instanzen eines Eintrags der ersten Liste zugeordnet werden, zumindest, dass viele Instanzen in der zweiten Liste.]
Okay, wie wäre es mit einem check, dass (mindestens) eine von einer ersten Liste gehört auch zu der zweiten Liste? Dies ist offensichtlich ein anderes Prädikat als der obige. Statt alle Elemente in der ersten Liste das Ziel ist, zufrieden zu sein, wenn es existiert einen Artikel in die erste Liste gehört, in die zweite Liste.
Diese Rekursion fehl, wenn es erreicht, wird eine leere Liste für das erste argument, aber erfolgreich, wenn an einem beliebigen Punkt vor, der ein Mitglied der ersten Liste gefunden wird, gehört zu der zweiten Liste. [Dieses Prädikat würde funktionieren, selbst wenn mehrere Instanzen eines Elements auftreten, in der Liste auf. Allerdings würden wir verfeinern müssen, die Logik, wenn wir wollten, check genau eine Element der ersten Liste gehört zu der zweiten Liste, und das würde bedeuten, sich Gedanken darüber, ob mehrere Instanzen sind im Einklang mit oder Widerspruch zu den genauen Zählung von einem.]
Was ist, wenn wir generalisieren wollen, auf dieses Kontrollkästchen, um zu überprüfen, ob (mindestens) die N Elemente der ersten Liste in die zweite? Die daraus resultierende Prädikat erfordert eine Dritte argument:
Diese Rekursion funktioniert durch die Liste, Dekrementieren das Dritte argument, indem man jedes mal, wenn ein Element in der ersten Liste, entpuppt sich in der zweiten Liste als gut, und erfolgreich, sobald der count wird auf 0 reduziert (oder weniger). [Nochmal der code hier muss mehr arbeiten, wenn die Listen können Wiederholungen.]
Schließlich Sie bitten, über etwas zu schreiben, dass "Renditen der fehlenden Werte" müssen, um die Anforderungen zu erfüllen. Das ist nicht gut definiert, im Falle der Prüfung für eine oder mehrere Positionen auf beiden Listen, da ein "fehlender Wert" sein könnte, der eine beliebige Anzahl von möglichen Positionen. In dem speziellen Fall, in dem wir darum gebeten, alle Gegenstände, auf die erste Liste gehören, auf die zweite Liste, die "fehlende Werte" bestimmt werden kann (wenn überhaupt).
Hier die Rekursion "bewegt", die Elemente aus der Eingabe der ersten Liste in die Ausgabe "fehlende Artikel" Dritte Liste, wenn, und nur wenn Sie nicht in der zweiten Liste.
Eine Letzte Bemerkung über Ihre Fragen, Anliegen notation. Im Prolog-Variablen sind Bezeichner, beginnen mit einem Großbuchstaben oder einem Unterstrich, also die Nutzung von A1, A2, etc. als posten auf der Liste ist problematisch, wenn diese behandelt werden wie "unknowns" statt (wie ich nehme an, das meintest du) unterschiedliche Atome (Konstanten). Der Wechsel zu Kleinbuchstaben würde das lösen.