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.

È stato utile?

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:

  1. Far passare intorno ad un backtrack(true) o un termine backtrack(false) attraverso il codice che si desidera controllare e interpretarlo nella definizione dei predicati si sta scrivendo a fallire rapidamente se è impostato su backtrack(false), o di continuare, se backtrack(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.
  2. 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.

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