Prolog, non riescono e non fare marcia indietro
-
04-10-2019 - |
Domanda
C'è qualche build-in predicato nella SWI-Prolog che sarà sempre un errore che impedisce macchina da backtracking - è fermare il programma da eseguire immediatamente (non è questo che fail/0
fa)?
Potrei usare tagli, ma non mi piacciono.
fare qualcosa di simile !, fail
non è un problema per me, ma per realizzare ciò che voglio, avrei dovuto usare tagli in più posizioni e questo è ciò che non mi piace.
Soluzione
Si potrebbe utilizzare le eccezioni. In base alla tua domanda - dovrebbe aiutare. Fare riferimento link
Altri suggerimenti
È possibile utilizzare il meccanismo esplicitamente progettato per aiutare a realizzare qualcosa, ma non mi piace?
si può sempre utilizzare non, che è zucchero sintattico per il taglio fallire
Due alternative vengono in mente:
- Far passare intorno ad un
backtrack(true)
o un terminebacktrack(false)
attraverso il codice che si desidera controllare e interpretarlo nella definizione dei predicati si sta scrivendo a fallire rapidamente se è impostato subacktrack(false)
, o di continuare, sebacktrack(true)
. Si noti che questa non sarà effettivamente prevenire backtracking; si deve solo consentire fast-fallimento . Anche se il vostro albero di prova è profondo, questo dovrebbe fornire un modo veloce di impedire l'esecuzione di certo codice sul backtracking. - utilizzare le eccezioni, come suggerito da @Xonix (+1). Un'eccezione terminerà la costruzione dell'albero a prova immediatamente, e si può passare qualsiasi dato termine attraverso l'eccezione fino al gestore, evitando più di esecuzione - probabilmente sarà più veloce rispetto alla prima opzione, ma non può essere più portabile.
Personalmente ho usato entrambi i metodi prima - il primo in cui ho anticipato la necessità prima di scrivere il codice, quest'ultimo dove non ho.
Peccato, questo è ciò che i tagli sono per.