Auflösung nimmt eine Liste und entfernt negierte Elemente aus dieser Liste. Die negierte Form wird durch eine Liste mit not
im Kopf dargestellt. Zum Beispiel, wenn ich '(a (not b) c (not f) (not a) b e)
habe, sollte meine Ausgabe '(c (not f) e)
sein. Ich habe Funktionen geschrieben remove-x
, die ein Element aus der Liste entfernt und match?
, die einen Wert und gibt den übereinstimmenden Wert in der Liste zurück. Wenn mein Wert 'a
ist, würde '(not a)
von der Liste zurückgegeben werden.Löschen von negierten Werten aus einer Liste in Schema
Also mein Problem ist in der Auflösungsfunktion. Ich möchte herausfinden, ob es irgendwelche negierten Elemente gibt und wenn es welche gibt, möchte ich beide das Element und seine Negation löschen. Ich brauche auch einen Weg, um herauszufinden, wie falsch zurück, wenn keine Änderungen an meiner Liste wurden aktualisiert:
(define (resolution? alist)
(cond ((null? alist) '())
((not (equal? #f (match? (car alist) (cdr alist))))
(and (remove-x (match? (car alist) (cdr alist)) alist)
(remove-x (car alist) alist)))
(else (cons (car alist) (resolution? cdr alist)))))
Diese beiden Funktionen unter Arbeit:
(define (match? value alist)
(cond ((null? alist) #f)
((and (list? (car alist))
(equal? value (car (cdr (car alist)))))
(car alist))
((equal? value (car alist)) (car alist))
(else (match? value (cdr alist)))))
(define (remove-x x alist)
(cond ((null? alist) '())
((equal? x (car alist)) (cdr alist))
(else (cons (car alist) (remove-x x (cdr alist))))))
Hallo Oscar, danke für Ihre Antwort! Kann ich einige Fragen zur Klärung stellen? Warum benutzen Sie für Ihre Vars-Funktion Lambda? Ich habe es noch nicht benutzt, also bin ich mir nicht sicher wann/warum wir es brauchen. Auch für Ihre negierte Vars-Funktion warum machst du 'cadr'? – Leena
Ich verwende 'map' und' filter', um die Entwicklung zu beschleunigen, aber sie sind einfach zu verstehen (siehe die Dokumentation). Grundsätzlich übergeben Sie eine Funktion, die Sie auf die Liste anwenden möchten, im Falle von 'map' wird sie auf jedes Element angewendet und gibt eine neue Liste zurück, im Falle von' filter' erstellt sie eine neue Liste mit nur den Elementen die ein Prädikat erfüllen. Zum Beispiel extrahiert 'map cadr' die Variable jeder Negation, probiere es an der Konsole aus, um zu sehen, was ich meine. –
Wenn die Verwendung von' map' und 'filter' problematisch ist, kann man eine explizite Rekursion schreiben, die dasselbe tut langweilig, um Funktionen zu überschreiben, die bereits in der Standardbibliothek vorhanden sind, aber ich denke, es ist in Ordnung, wenn Sie lernen. –