2017-06-15 3 views
0
#;2> (topological-sort 
'((i am) 
    (not trying) 
    (confuse the) 
    (am trying) 
    (trying to) 
    (am not) 
    (trying the) 
    (to confuse) 
    (the issue)) 
    eqv?) 
(not i am trying to confuse the issue) 

die Sublisten Bestellung auf diese Weise kann es machen mehr klar, was die richtige Ausgabe sollte sein:Topologisch-Sortierfehler in Huhn-Schema?

(i am) 
    (am not) 
    (not trying) 
    (trying to) 
    (to confuse) 
    (am trying) 
    (confuse the) 
    (trying the) 
    (the issue) 

Es scheint, dass die Reihenfolge sein sollte:

i am not trying to confuse the issue 

Ist das ein Bug oder fehle ich etwas?

---- Edit: ----

Kombination Sublisten mit gemeinsamen Köpfen:

(topological-sort 
'((i am) 
    (not trying) 
    (confuse the) 
    (am trying not) 
    (trying to the) 
    (to confuse) 
    (the issue)) 
    eqv?) 

(i am not trying to confuse the issue) 

So scheint es der richtige Ansatz zu Vorprozess ist der Eingang sicher zu stellen, dass keine zwei Teil-Listen teilen Sie den gleichen Kopf.

die Rosetta-Code topologische Sortierung Problem Solving:

(use srfi-1) ; list operators 
(use srfi-69) ; hash-tables 

(define data 
'((des_system_lib std synopsys std_cell_lib des_system_lib dw02 dw01 ramlib ieee) 
    (dw01    ieee dw01 dware gtech) 
    (dw02    ieee dw02 dware) 
    (dw03    std synopsys dware dw03 dw02 dw01 ieee gtech) 
    (dw04    dw04 ieee dw01 dware gtech) 
    (dw05    dw05 ieee dware) 
    (dw06    dw06 ieee dware) 
    (dw07    ieee dware) 
    (dware   ieee dware) 
    (gtech   ieee gtech) 
    (ramlib   std ieee) 
    (std_cell_lib  ieee std_cell_lib) 
    (synopsys))) 

(define table (make-hash-table)) 

(for-each 
    (lambda (xs) 
    (let ((head (car xs)) (tail (cdr xs))) 
     (for-each 
     (lambda(key) 
      (when (not (eqv? key head)) 
      (hash-table-update!/default 
       table key (lambda (accum) (cons head accum)) '()))) 
     tail))) 
    data) 

(define answer 
    (topological-sort (hash-table->alist table) eqv?)) 

answer 

Ein mögliches Ergebnis (da Hash-Tabellen ungeordnet sind, kann es jedes Mal anders sein):

(std ieee dware dw05 dw06 dw07 ramlib std_cell_lib gtech synopsys 
dw02 dw01 des_system_lib dw03 dw04) 

Der Versuch, die zur Validierung Antwort:

(any 
    (lambda (tail) 
    (any 
     (lambda (key) 
     (and (hash-table-exists? table key) 
      (member (car tail) (hash-table-ref table key)))) 
     (cdr tail))) 
    (reverse (pair-fold cons '() answer))) 

#f 

Es scheint zu stimmen.

Antwort