Question

pred(Args).
pred(Args) :-
    goalA,
    goalB,
    !,
    pred(Args).
pred(Args) :-
    goalC,
    goalD,
    !,
    pred(Args).

Normalement, je voudrais écrire un prédicat récursif qui a été concerné par quelque chose de performance de mémoire le long des lignes de l'extrait ci-dessus du code. Avec la coupe utilisée pour tenter de forcer l'optimisation des appels de queue pour se produire. J'ai récemment traversé une grande base de code Prolog et ont trouvé quelques exemples où la coupe est en fait après l'appel récursif plutôt que immédiatement avant. On peut supposer que cela a pour effet d'empêcher l'optimisation des appels récursifs de se produire plutôt que de l'aider.

Ma question est ce que je peux passer la coupe à partir après l'appel récursif immédiatement avant sans affecter le sens du programme? Cela suppose qu'il ya une coupure dans la même position relative pour chaque clause du prédicat.

Maintenant, j'ai pensé à ce sujet un peu plus, je pense peut-être la réponse est « pas nécessairement », mais après avoir réécrit tout le code avec la coupe avant l'appel et de trouver que la suite de test est toujours passe, je me demande aussi s'il pourrait y avoir une autre raison ésotérique pour écrire des prédicats comme celui-ci. Ou est-ce juste mauvais codage?

Était-ce utile?

La solution

Je pense que cela pourrait être mauvais codage (ou malentendu ce que l'auteur a fait)

Je dis cela, parce que je, moi-même, fait une fois la même erreur:

https: //mailbox.iai .uni-bonn.de / mailman / public / SWI-Prolog / 2009 / 001540.html

http://xonix.habrahabr.ru/blog/60430/ (avertissement , en russe)

Mais les gens de SWI-liste de diffusion ont confirmé que le code de bonne façon récursive queue est

head :-
       <guard goals>, !,
       <deterministic stuff>,
       head.
head :-
       ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top