Vincolo di raggiungibilità in SWI / CLP (FD)
-
21-12-2019 - |
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.
Soluzione
Sicstus 'fd_closure/2
è molto simile a term_attvars/2
TagCode 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 è.