2011-01-18 10 views
5

Quiero definir un operador "++>" de forma que escribir "a ++> b" haga una lista de [a, b].¿Cómo se define un operador en prolog para hacer una lista?

He escrito el siguiente código, pero parece que no hace el trabajo.

++>(X,Y) :- 
[X,Y]. 

:- op(500,xfy,++>). 
+2

En realidad, hay dos cuestiones aquí, la definición de operador "++>" como una notación infija, y organizando que la expresión "a ++> b" sería "evaluada" como el término [a, b]. La primera parte de esto es Prolog bastante estándar, como parece saber por la mención de ** op/3 **. Obtener la maquinaria para "evaluar" los términos que involucran al nuevo operador es más complicado. Para funciones aritméticas, SWI-Prolog tiene una directiva que le permite a ** is/2 ** trabajar con funciones definidas por el usuario, pero la suya no es una función aritmética. Podría mostrarle cómo definir un nuevo predicado ** iz/2 ** que podría "evaluar" ++> términos. – hardmath

+0

Tuve la ocasión de ir a buscar la directiva 'arithmetic_function/1' de SWI-Prolog, y noté que ha sido [obsoleta, quizás eliminada] (http://www.swi-prolog.org/pldoc/man?predicate= arithmetic_function/1). – hardmath

Respuesta

0
:- op(500,xfy,++>). 
++>(X,Y,[X,Y]). 

y utilizarlo como

?- ++>(1,2,X). 
X = [1, 2]. 

cálculos En realidad, Prolog no está orientada, por lo que los operadores es sólo a los términos sinónimos. Quiere un término \ 3, donde un elemento es una lista de los otros dos. Entonces, no puede usar el operador de 2 posiciones en ese caso. Por cierto, no puede usar es en esta situación, ya que solo se usa en casos aritméticos.

+1

No tiene sentido declarar un operador en su ejemplo. Usted declaró un operador de 2 argumentos (++>/2) pero definió un predicado de 3 argumentos (++>/3) – gusbro

+1

Correcto, entonces declaremos un operador 3place –

0

hace este trabajo para usted:

++>((X,Y),Z) :-Z= [X,Y]. 

:- op(500,xfy,++>). 
0

[a,b,c] es sólo azúcar sintáctica para '.'(a,'.'(b,'.'(c)))). Por lo que puede definir el operador de la misma y escribir un predicado de conversión:

:- op(500,xfy,'++>'). 

convert('++>'(A,B),[A|R]) :- 
    convert(B,R). 
convert(Any,[Any]). 

Ejemplo:

| ?- X = 1++>2++>3, convert(X,Y).          
X = 1++>2++>3 
Y = [1,2,3] ? 
yes 
Cuestiones relacionadas