Domanda

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

Normalmente avrei scritto un predicato ricorsivo che si occupava di qualcosa di prestazioni della memoria sulla falsariga di questo frammento di codice di codice. Con il taglio utilizzato per forzare l'ottimizzazione chiamata coda a verificarsi. Sono stato di recente passando attraverso una grande base di codice di prologo ed ho trovato alcuni esempi in cui il taglio è in realtà dopo la chiamata ricorsiva, piuttosto che immediatamente prima. Presumibilmente questo ha l'effetto di impedire l'ottimizzazione chiamata coda accada, piuttosto che aiutare esso.

La mia domanda è posso spostare il taglio da dopo la chiamata ricorsiva a immediatamente prima di esso senza alterare il significato del programma? Ciò presuppone che v'è un taglio nella stessa posizione relativa per ogni clausola del predicato.

Ora io ho pensato ancora un po ', sto pensando che forse la risposta è "non necessariamente", ma dopo aver riscritto tutto il codice con il taglio prima della chiamata e trovando che la suite di test è ancora passando, ho 'm anche chiedendo se ci potrebbe essere qualche altra ragione esoterica per la scrittura di predicati come questo. O è solo cattiva codifica?

È stato utile?

Soluzione

La mia ipotesi è che potrebbe essere un male di codifica (o incomprensione ciò che l'autore stava facendo)

che sto dicendo questo, perché io, io stesso, una volta che ha fatto lo stesso errore:

https: //mailbox.iai .uni-bonn.de / mailman / public / swi-prolog / 2009 / 001540.html

http://xonix.habrahabr.ru/blog/60430/ (warning , in russo)

Ma la gente da SWI mailing-list hanno confermato che modo giusto di codice ricorsiva in coda è

head :-
       <guard goals>, !,
       <deterministic stuff>,
       head.
head :-
       ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top