Question

Y at-il accumulation dans prédicat dans SWI-Prolog qui échouent toujours et de l'empêcher de faire marche arrière - il est d'arrêter le programme d'exécuter immédiatement (ce n'est pas ce que fail/0 fait)? Je pourrais utiliser des coupes, mais je ne les aime pas.

Faire quelque chose comme !, fail est pas un problème pour moi, mais pour accomplir ce que je veux, je dois utiliser des coupes dans plus d'endroits, ce qui est ce que je ne aime pas.

Était-ce utile?

La solution

Vous pouvez utiliser des exceptions. Sur la base de votre question - il devrait aider. Reportez-vous lien

Autres conseils

Vous pouvez utiliser le mécanisme explicitement conçu pour vous aider à accomplir quelque chose, mais vous ne l'aimez pas?

Vous pouvez toujours utiliser pas, ce qui est du sucre syntaxique pour la coupe échec

Deux alternatives viennent à l'esprit:

  1. Passez autour d'un ou backtrack(true) terme backtrack(false) par le code que vous voulez contrôler et interpréter dans la définition des prédicats que vous écrivez à l'échec rapidement si elle est réglée sur backtrack(false), ou continuer si backtrack(true). Notez que cela n'empêchera pas fait marche arrière; il devrait simplement permettre à défaillance rapide . Même si votre arbre de preuve est profonde, cela devrait fournir un moyen rapide d'empêcher l'exécution de code sur certains retours en arrière.
  2. Utiliser des exceptions, comme le suggère @Xonix (+1). Lancer une exception mettra fin à la construction d'arbre de preuve immédiatement, et vous pouvez passer des données à long terme par l'exception à la gestionnaire, sans passer par une exécution plus - il sera probablement plus rapide que la première option, mais ne peut pas être aussi portable.

Personnellement, je l'ai utilisé les deux méthodes avant - la première où j'ai anticipé le besoin avant d'écrire le code, celui-ci où je n'ai pas.

Dommage, c'est ce que les réductions sont pour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top