Domanda

Sto cercando di determinare quella forma di un grafico diretto risolvendo vincoli a presenza di nodi e archi, ad esempio, la variabile binaria V1V2 è 1 se è presente un arco dal nodo V1 a V2.Vorrei esprimere il vincolo di raggiungibilità (o, in alternativa, trovare una chiusura transitiva), ad es. Per richiedere che il grafico sia collegato, o che vi sia un percorso da un dato nodo a un altro nodo.

Ho visto che Sicstus Prolog ha fd_closure per questo scopo, ma non ho trovato nulla di simile in SWI Prolog.Dovrei usare CHR ?Ho esaminato gli esempi di coerenza dell'arco / percorso, ma non sono sicuro se sto guardando nella giusta direzione.

È stato utile?

Soluzione

Sicstus 'fd_closure/2 è molto simile a term_attvars/2TagCode di SWI-PROLOG.Ti dà tutte le variabili che possono essere raggiunte transitivamente tramite attributi (e SWI's CLP (FD) utilizza attributi per memorizzare vincoli).

Nota che in genere fai non è necessario questi predicati.Sono usati per esempio sul Toplevel per ottenere obiettivi residui.

È possibile esprimere un grafico con vincoli di dominio finito senza utilizzare nessuno di questi predicati.Ad esempio, utilizzare una variabile di dominio finita B_i_j che è 1 iff c'è un arco dal nodo i al nodo j .

Se hai bisogno di proprietà più forti, probabilmente avrete bisogno di limiti più forti .Ad esempio, circuit/1 è disponibile in Sicstus e SWI e descrive un circuito hamiltoniano.Per altre proprietà, è possibile implementare algoritmi filtranti dedicati.

Altri suggerimenti

Con generacodictagcode e generacodictagcode dovresti essere in grado di ottenere (modifica: quasi) lo stesso effetto di copy_term/3.

Si prega di notare che term_variables/2 in SicSt funziona solo per i vincoli FD.Altri collegamenti tra le variabili non vengono presi in considerazione.

Modifica: in questo modo otterrai solo copie delle variabili interne - questo dovrebbe essere abbastanza buono da determinare la forma.Tuttavia, potresti voler fare riferimento a quelle variabili in un secondo momento in cui la soluzione @ mat è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top