Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Prolog zählen eines Wortes innerhalb einer Liste





Frage

Hallo Leute, ich hab da ein Problem mit Prolog, ich möchte das Vorkommen eines Wortes innerhalb einer Wortliste zählen. Bisher hab ichs nur geschafft aufzuählen wieviele Worte die Liste hat. countwort([],0) countword([Kopf|Tail],X):- countword(Tail,XNeu), X is XNeu + 1. Das aufgerufen mit z.B.: countword([ein,hase,läuft,übers,feld],X). ergibt 5. So jetzt möchte ich aber aufzählen wie oft 'ein' in der Liste von Wörtern vorkommt. Irgendwie schaf ich das aber nicht, egal was ich mache es kommt immer nur ein Abbruch zustande. Kann mir da jemand helfen?

Antwort 1 von CREe.K

Wie du richtigerweise erkannt hast, werden Bedingungen durch mehrere gleichnamige Prozeduren realisiert. Für dein Problem bräuchtest du mind. 3 Bedingungen.
1. was passiert wenn die Liste leer ist.
2. was passiert, wenn das zu suchende Element gefunden wurde
3. was passiert, wenn das zu suchende Element nicht gefunden wird

Es ist zu empfehlen, das zu suchende Element in einer weiteren Variablen (in der Prozedurparameterliste) anzugegen
z.B. count([Kopf|Tail], SuchElement, X)

Weiterhin ist folgender Algorithmus anwendbar:
1. Prüfe, ob die Liste leer ist, wenn ja dann setzte X=0
2. Prüfe, ob das Kopfelement der Liste dem SuchElement entspricht. Wenn das der Fall ist, dann führe die "Zählung" mit dem Tail der Liste (welcher ja wiederrum eine Liste ist) erneut (sprich rekursiv) durch. Erhöhe anschließend X um eins.
3. Prüfe, ob das Kopfelement der Liste nicht dem Suchelement entspricht (genauer gesagt, ignoriere an dieser Stelle das Kopfelement, da die dritte Bedingung / dritte gleichnamige Prozedur nur dann auf der gleichen Rekursionsebene ausgeführt wird, wenn die ersten zwei (im Script weiter oben stehenden) nicht erfüllt sind). Trifft diese Bedingung zu, dann Zähle mit dem Tail der Liste weiter (und erhöhe X nicht um eins.)


Ob KopfElement gleich dem Suchelement ist, kann man leicht in der "Parameterliste" prüfen, z.B.

count([SuchElement|Tail], Suchelement, X):=


Ausprogrammiert habe ich dein Problem nicht (weil das bloße Angeben des Quellcodes für dich keinen Lerneffekt hat), jedoch sollten die obigen Tipps zu einem Ergebnis führen. (Natürlich ist es möglich, dass ich jetzt auf die Schnelle etwas nicht bedacht habe.)

Gruß CREe.K

PS: Tipp für Funktionserweiterung:
Wenn du das Vorkommen aller Elemente zählen willst, dann empfehle ich, in einer übergeordneten Prozedur das "X" durch eine Liste bestehend aus dem Paar Element/Anzahl anzuwenden und anhand der Suchliste (vom Kopf beginnend) die o.g. Prozedur für jedes Element aufzurufen - und das Ergebnis eben in der angesprochenen Rückgabeliste einzufügen.

Antwort 2 von CREe.K

... natürlich ist (anders als im obigen Bsp) in Prolog (zumind. in der SWI Variante) die Groß/Kleinschreibung zu beachten ...

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: