2011-11-21 12 views
26

Qualcuno può spiegare la differenza tra == e l'operatore = in Prolog? So che X = Y significa X unifica con Y ed è vero se X è già unificato con Y o può essere fatto a, ma non capisco come questo differisca da ==.Qual è la differenza tra == e = in Prolog?

Follow-up: questo (vedere Risposta accettata) ha senso. Ancora una domanda, c'è mai una situazione in cui X \= Y è vero e X \== Y è falso (o viceversa)? Cioè, prova X \= Y se non possono essere unificati o se non sono attualmente unificati?

+1

"Questo ha senso.": Potresti per favore aggiungere ciò che ha senso o rimuovere questo dalla domanda e alla fine aggiungerlo come commento a una risposta? –

+0

@moose: Il "follow-up" (combinazione di negazione con '=' e '==') è iniziato come commenti alla mia risposta. Sospetto che "ciò ha senso" è in riferimento ai miei primi due paragrafi, dopo di che ho risposto ulteriormente. Vedi se la mia modifica sembra sufficiente a chiarire il senso di ciò. – hardmath

risposta

29

L'= "operatore" in Prolog è in realtà un predicato (con notazione infisso) =/2 che riesce quando i due termini sono unificati. Così X = 2 o 2 = X importo alla stessa cosa, un obiettivo di unificare X con 2.

Il "operatore" == differenzia in quanto riesce solo se i due termini sono già identici senza ulteriore unificazione. Così X == 2 è vero solo se la variabile X era stato precedentemente assegnato il valore 2.

Aggiunto: E 'interessante lavorare con ciò che accade quando "non" viene mescolato in questi obiettivi, secondo il commento di Johns qui sotto. Guarda il simpatico set of examples nell'Amzi! Documentazione Prolog.

\= significa che i due termini non possono essere unificati, vale a dire che l'unificazione non riesce. Come con tutte le applicazioni della negazione come fallimento, "non unificato" non (e non può) portare a qualsiasi unificazione tra i termini.

\== significa che i due termini non sono identici. Anche qui non avviene alcuna unificazione, anche se questo ha successo.

Infine, pensa a cosa farà lo not(not(X = Y)). L'obiettivo interiore ha successo se X e Y (che possono essere termini arbitrari) possono essere unificati, così come la doppia negazione di ciò.Tuttavia, avvolgere l'obiettivo interiore all'interno della doppia negazione produce un obiettivo che riesce a raggiungere se i due termini possono essere unificati ma senza unificare i termini.

Viene lasciato come esercizio per il lettore valutare se not(not(X == Y)) abbia un'utilità simile.

+0

Questo ha senso. Ancora una domanda, c'è mai una situazione in cui 'X \ = Y' è vero e' X \ == Y' è falso (o viceversa)? Cioè, prova 'X \ = Y' se non possono essere unificati o se non sono attualmente unificati? – JohnS

+0

@JohnS: Si noti che 'X \ = Y' è uguale a' not (X = Y) 'o, come previsto da alcune implementazioni Prolog,' \ + (X = Y) '. Vedere la parte aggiunta della mia risposta per ulteriori osservazioni. – hardmath

+0

"Così X == 2 è vero solo se alla variabile X era stato precedentemente assegnato il valore 2." è molto importante da notare, perché puoi avere due calcoli con THE SAME OUTCOME che non passano '=='. Per esempio '2/2 * 2 == * (2, (/ (2,2))).' Perché il termine a sinistra non viene effettivamente scomposto in termini aritmetici finché non viene valutato. –

5

= sta per unificazione, significa che proverà a collegare le variabili libere per farle corrispondere agli altri membri. ad esempio: A = h (X) trasformerà A nel termine h (X) se A è libero e fallirà se A è vincolato a dire 5. l'unificazione è ottima perché è possibile eseguire il modello con esso, per esempio:

X-Y:Z = 5-[a, b, c]:y 

vi darà

X = 5, Y = [a, b, c] and Z = y 

perché prologo cerca di fare XY: Z adatta l'espressione 5- [a, b, c]: a. È molto utile.

Nota che l'unificazione è usato quando si chiama un predicato e alcune tecniche derivarne: che vogliate restituire il valore di un accumulatore in un predicato ricorsivo, si può fare:

recursive_predicate([], Accumulator, Accumulator). 
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff. 

la prima clausola cercherò di unificare il terzo e il secondo argomento, quindi se il terzo è libero, ora ha lo stesso valore del secondo.

== è l'uguaglianza senza cercare di associare le variabili.

Problemi correlati