librelist archives

« back to archive

Pregunta Basica sobre Matching

Pregunta Basica sobre Matching

From:
Angel Java Lopez
Date:
2012-03-31 @ 21:35
Hola gente!

Estoy escribiendo un minimo interprete Erlang en C#, usando TDD, estoy en
el tema de matching.

Probando en http://www.tryerlang.org/
me encuentro con la sorpresa:

Erlang R15B (erts-5.9)
> [X,Y] = [1,X]­.
"variable 'X' is unbound"
> X.
"variable 'X' is unbound"
> X=1, Y=X.
1

Lo que me "asombra" es el primer resultado. En Prolog, hubiera esperado:

- Se matchea X con 1
- Se matchea Y con X, siendo que X ya es 1
- Todo ok
o sea, mas o menos lo que pasa en la tercera evaluacion de arriba.

Pero nones aca en Erlang.... es asi? Rationale/Explicacion por que es asi
en Erlang?

Gracias por cualquier info!

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Re: [erlar] Pregunta Basica sobre Matching

From:
Mariano Guerra
Date:
2012-03-31 @ 23:04
2012/3/31 Angel Java Lopez <ajlopez2000@gmail.com>:
> Hola gente!
>
> Estoy escribiendo un minimo interprete Erlang en C#, usando TDD, estoy en el
> tema de matching.
>
> Probando en http://www.tryerlang.org/
> me encuentro con la sorpresa:
>
> Erlang R15B (erts-5.9)
>> [X,Y] = [1,X]­.
> "variable 'X' is unbound"
>> X.
> "variable 'X' is unbound"
>> X=1, Y=X.
> 1
>
> Lo que me "asombra" es el primer resultado. En Prolog, hubiera esperado:
>
> - Se matchea X con 1
> - Se matchea Y con X, siendo que X ya es 1
> - Todo ok
> o sea, mas o menos lo que pasa en la tercera evaluacion de arriba.
>
> Pero nones aca en Erlang.... es asi? Rationale/Explicacion por que es asi en
> Erlang?

supongo que porque le binding de variables no "bindeadas" se hace del
lado izquierdo de la expresion?

1> [1, 2] = [X, Y].
* 1: variable 'X' is unbound

en tu caso X esta del lado derecho y es unbound, se que esta del lado
izquiero, pero supongo que asume que todo lo que esta del lado derecho
tiene que estar definido y por lo visto no hace secuencial de
izquierda a derecha sino en un solo paso.

Re: [erlar] Pregunta Basica sobre Matching

From:
Ale
Date:
2012-04-01 @ 04:10
>> Pero nones aca en Erlang.... es asi? Rationale/Explicacion por que es asi en
>> Erlang?
>
> supongo que porque le binding de variables no "bindeadas" se hace del
> lado izquierdo de la expresion?
>
> 1> [1, 2] = [X, Y].
> * 1: variable 'X' is unbound
>
> en tu caso X esta del lado derecho y es unbound, se que esta del lado
> izquiero, pero supongo que asume que todo lo que esta del lado derecho
> tiene que estar definido y por lo visto no hace secuencial de
> izquierda a derecha sino en un solo paso.

En una operación "=" donde tenes Patrón = Expresión, primero se evalúa
lo que está del lado derecho del operador, entonces si tenes variables
no ligadas (bounded) te va a tirar el error porque no puede evaluar la
expresión.

Pero más allá de eso Prolog hace lo que se llama unificación[0] que es
distinto del pattern matching que hace Erlang, tengo un poco oxidado
las diferencias así que te mando a ver esto:

http://stackoverflow.com/questions/4442314/differences-between-pattern-matching-and-unification

En Prolog cosas así X = Y (e Y está unbounded) porque al unificarlas Y
se vuelve un alias de X.


[0]http://en.wikipedia.org/wiki/Unification_%28computer_science%29#Unification_in_logic_programming

De lo poco que sé, hacer unificación es caro (y la verdad es otro paradigma)

Saludos,
-- 
Ale.

Re: [erlar] Pregunta Basica sobre Matching

From:
Ale
Date:
2012-04-01 @ 04:58
En Prolog cosas así X = Y (e Y está unbounded) _andan_ porque al
unificarlas Y se vuelve un alias de X.

Salud,
-- 
Ale.

Re: [erlar] Pregunta Basica sobre Matching

From:
Angel Java Lopez
Date:
2012-04-01 @ 09:08
Hola gente!

Gracias por las respuestas. Ahora lo entendi! Muy bueno el enlace de
Alejandro a la pregunta de StackOverflow.

Hmmm... si, parece que eligieron matching sobre unification porque esta
ultima es mas costosa de implementar.

Se me habia escapado que es Patron = Expresion. Pense que era Expresion =
Expresion. Bien, a recodificar los casos de MatchExpression en mi
interprete. TDD saves my day ;-)

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

2012/4/1 Ale <peralta.alejandro@gmail.com>

> En Prolog cosas así X = Y (e Y está unbounded) _andan_ porque al
> unificarlas Y se vuelve un alias de X.
>
> Salud,
> --
> Ale.
>