2012-11-22 15 views
15

Sto lavorando su qualche prologo che non conosco.Prolog "o" operatore, domanda

Sto cercando un "o" operatore

registered(X, Y), Y=ct101, Y=ct102, Y=ct103. 

Ecco la mia interrogazione. Quello che voglio scrivere è il codice che sarà:

"ritorno X, dato che Y è uguale al valore di Z o il valore di Q o il valore P"

sto chiedendo di tornare X se Y è uguale a tutti e 3 però. Qual è l'operatore o qui? Ce n'è uno?

risposta

9

si puo 'richiamare' binding alternativi su Y questo modo:

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103). 

Nota la parentesi sono tenuti a mantenere il flusso di controllo corretta esecuzione. Il ;/2 è l'operatore generale or. Per il vostro uso limitato si potrebbe pure la scelta più idiomatica

...registered(X, Y), member(Y, [ct101,ct102,ct103]). 

che il backtracking lega Y per ciascun membro della lista.

modifica Ho capito con ritardo l'ultima richiesta. Se si desidera che Y partita tutti 3 i valori delle o inadeguato, usare al posto

...registered(X, ct101), registered(X, ct102), registered(X, ct103). 

o il più compatto

...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]). 

findall/3 creare l'elenco nello stesso ordine che ha registrato/2 succede. Quindi uso sort per garantire la corrispondenza.

...setof(Y, registered(X, Y), [ct101,ct102,ct103]). 

setof/3 smista anche la lista dei risultati

+0

Grazie, questo ha aiutato un sacco. Non ero sicuro di come farlo, ma ho intenzione di leggere su binding e backtracking. Apprezzato! – Eogcloud

23

Solo un altro punto di vista. Esecuzione di un "o" in Prolog può essere fatto anche con l'operatore "disgiunta" o semi-colon:

registered(X, Y) :- 
    X = ct101; X = ct102; X = ct103. 

Per una spiegazione più completa:

Predicate control in Prolog