L'ho letto in un libro ma non è stato spiegato affatto. Anche io non l'ho mai visto in un programma. Fa parte della sintassi di Prolog? Per cosa è? Lo usi?Qual è l'operatore -> in Prolog e come posso usarlo?
Grazie
L'ho letto in un libro ma non è stato spiegato affatto. Anche io non l'ho mai visto in un programma. Fa parte della sintassi di Prolog? Per cosa è? Lo usi?Qual è l'operatore -> in Prolog e come posso usarlo?
Grazie
Rappresenta implicazione. Il lato destro viene eseguito solo se il lato sinistro è vero. Quindi, se si dispone di questo codice,
implication(X) :-
(X = a ->
write('Argument a received.'), nl
; X = b ->
write('Argument b received.'), nl
;
write('Received unknown argument.'), nl
).
allora sarà scrivere cose diverse a seconda che l'argomento: (. link to documentation)
?- implication(a).
Argument a received.
true.
?- implication(b).
Argument b received.
true.
?- implication(c).
Received unknown argument.
true.
Attendi, se è implicito, logico 'false -> false' dovrebbe dare' true ', quando in realtà no. Cosa c'è? –
Si tratta di una versione locale del taglio, vedere ad esempio lo section on control predicated nel manuale SWI.
Viene principalmente utilizzato per implementare if-then-else di (condizione -> true-branch; false-branch). Una volta che la condizione ha successo, non c'è un ritorno indietro dal ramo vero nella condizione o nel ramo falso, ma è ancora possibile tornare indietro da if-then-else. Pertanto è chiamato taglio locale o taglio morbido.
Il softcut è disponibile in SWI tramite "* ->", non "->"! – mat
È possibile evitare di utilizzarlo scrivendo qualcosa di più verboso. Se riscrivo Stephan's predicato:
implication(X) :-
(
X = a,
write('Argument a received.'), nl
;
X = b,
write('Argument b received.'), nl
;
X \= a,
X \= b,
write('Received unknown argument.'), nl
).
(Si. Non credo che ci sia alcun problema con l'utilizzo di esso, ma il mio capo era paranoico su di esso per qualche ragione, così abbiamo sempre usato l'approccio di cui sopra)
Con entrambe le versioni, devi stare attento a coprire tutti i casi che intendi coprire, specialmente se hai molti rami.
ETA: Non sono sicuro se questo è completamente equivalente a quello di Stephan, a causa del backtracking se si dispone di implication(X)
. Ma per ora non ho un interprete Prolog da controllare.
Hmm. Non sono così tanto in Prolog, ma questo sembra violare il principio di ASCIUTTO. Non sono sicuro se ne vale la pena! Voglio dire, specialmente se le condizioni preliminari diventano leggermente più complesse, questo potrebbe diventare complicato. Per quanto riguarda il backtracking: per questa versione (SWI-) il prologo non ritorna immediatamente al prompt di 'implicazione (a)' e 'implicazione (b)', quindi in effetti si tenterà di fare un backtracking. – Stephan202
Sì, certo non sto dicendo che questa è un'alternativa superiore, solo che è un'alternativa. :) – pfctdayelise
Ho letto potrebbe essere utilizzato per scrivere parser. SUM -> O1 + O2 o qualcosa del genere ... –
Questo è -> (notare i due caratteri), vedere il Manuale SWI: http://www.swi-prolog.org/pldoc/doc_for?object=section%282 % 2c% 20% 274,12% 27% 2c% 20swi% 28% 27% 2fdoc% 2fManuale% 2fDCG.html% 27% 29% 29 – starblue