2009-11-21 12 views
7

He leído sobre él en un libro pero no fue explicado en absoluto. Tampoco lo vi en un programa. Es parte de la sintaxis de Prolog? ¿Para qué es esto? ¿Lo usas?¿Cuál es el operador -> en Prolog y cómo puedo usarlo?

Gracias

+0

Lo leí podría ser utilizado para escribir analizadores. SUM -> O1 + O2 o algo ... –

+2

Eso es -> (nótese los dos caracteres), consulte el Manual de SWI: http://www.swi-prolog.org/pldoc/doc_for?object=section%282 % 2c% 20% 274.12% 27% 2c% 20swi% 28% 27% 2fdoc% 2fManual% 2fDCG.html% 27% 29% 29 – starblue

Respuesta

7

Representa implicación. El lado derecho solo se ejecuta si el lado izquierdo es verdadero. Por lo tanto, si usted tiene este código,

implication(X) :- 
    (X = a -> 
    write('Argument a received.'), nl 
    ; X = b -> 
    write('Argument b received.'), nl 
    ; 
    write('Received unknown argument.'), nl 
). 

entonces será escribir cosas diferentes en función de que el argumento: (. link to documentation)

?- implication(a). 
Argument a received. 
true. 

?- implication(b). 
Argument b received. 
true. 

?- implication(c). 
Received unknown argument. 
true. 

+0

Espera, si es una implicación, entonces lógico 'falso -> falso' debería dar 'verdadero ', cuando en realidad no es así. ¿Qué hay con eso? –

2

Es una versión local de la corte, ver por ejemplo, el section on control predicated en el manual de SWI.

Se usa principalmente para implementar if-then-else por (condición -> rama verdadera; rama falsa). Una vez que la condición tiene éxito, no hay retroceso desde la rama verdadera hacia la condición o hacia la rama falsa, pero seguir retrocediendo fuera del if-entonces-else todavía es posible. Por lo tanto, se llama corte local o corte suave.

+0

¡El corte suave está disponible en SWI a través de "* ->", no "->"! – mat

0

Es posible evitar el uso de algo más prolijo. Si vuelvo a escribir Stephan's predicado:

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 
). 

(Sí. No creo que haya ningún problema con el uso, pero mi jefe estaba paranoico al respecto por alguna razón, por lo que siempre se usa el enfoque anterior)

En cualquiera de las versiones, debe tener cuidado de cubrir todos los casos que pretenda cubrir, especialmente si tiene muchas sucursales.

ETA: No estoy seguro si esto es completamente equivalente a Stephan's, debido a retroceder si tiene implication(X). Pero no tengo un intérprete Prolog ahora mismo para verificar.

+0

Hmm. No estoy tan interesado en Prolog, pero esto parece violar el principio DRY. ¡No estoy seguro si eso lo vale! Quiero decir, especialmente si las condiciones previas se vuelven un poco más complejas, esto puede ser complicado. En cuanto a retroceder: para esta versión (SWI-) el prólogo no regresa inmediatamente al prompt sobre 'implication (a)' y 'implication (b)', así que se intentará retroceder un poco. – Stephan202

+0

Sí, definitivamente no estoy diciendo que esta sea una alternativa superior, solo que es una alternativa. :) – pfctdayelise

Cuestiones relacionadas