2016-12-05 10 views
3

Ich lerne Prolog und eine Übung in einem Kurs sagt jedes atomare Element in einer Liste zu löschen, die eine überlappende Liste sein kann. Wenn ichProlog Leere Liste in Listen

clean([1,[2,[3],4],5],L). 

sollte es werden

L = [[[]]] 

Wie es getan werden kann?

Antwort

0

Der Weg, dies zu lösen, besteht darin, jeden Fall einer Liste zu durchdenken, auf die Sie stoßen könnten. Wenn Sie beispielsweise auf eine leere Liste stoßen, wie lautet die Antwort? Die Antwort ist einfach die leere Liste.

clean([],[]). 

Nun, was ist, wenn das erste Element ein Atom ist (nicht eine andere Liste)? Dann entfernen wir das Element - was bedeutet, dass wir es nicht zur Ergebnisliste hinzufügen.

clean([H|T],L):- \+ is_list(H), clean(T,L). 

Und schließlich, was ist, wenn das erste Element eine andere Liste ist? Dann fügen wir die Liste der Antwort hinzu, aber erst nach der Reinigung. Die Art, sie der Antwortliste hinzuzufügen, besteht darin, sie als Kopf der Antwortliste "voranzustellen", also "[Empty | L]".

clean([H|T],[Empty|L]):- is_list(H), clean(H,Empty), clean(T,L). 

Setzen Sie die obigen Klauseln zusammen in ein Programm und das ist Ihre Antwort.