2011-01-18 7 views
5

Je veux définir un opérateur "++>" d'une manière telle que taper "a ++> b" fera une liste de [a, b].Comment définir un opérateur dans prolog pour faire une liste?

J'ai écrit le code suivant, mais il ne semble pas faire le travail.

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

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

Il y a vraiment deux problèmes ici, l'opérateur définissant « ++> » comme une notation infixe, et faire en sorte que l'expression "a ++> b" soit "évaluée" comme le terme [a, b]. La première partie de ceci est assez standard Prolog comme vous semblez savoir de la mention de ** op/3 **. Obtenir la machinerie en place pour «évaluer» les termes impliquant le nouvel opérateur est plus délicat. Pour les fonctions arithmétiques, SWI-Prolog a une directive qui permet à ** is/2 ** de fonctionner avec des fonctions définies par l'utilisateur, mais la vôtre n'est pas une fonction arithmétique. Je pourrais vous montrer comment définir un nouveau prédicat ** iz/2 ** qui «évaluerait» les termes +++. – hardmath

+0

J'ai eu l'occasion d'aller chercher la directive 'arithmetic_function/1' de SWI-Prolog, et je remarque qu'elle a été [obsolète, peut-être abandonnée] (http://www.swi-prolog.org/pldoc/man?predicate= fonction arithmétique/1). – hardmath

Répondre

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

Et l'utiliser comme

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

En fait, Prolog ne calculs orientés, afin que les opérateurs sont des synonymes des termes. Vous voulez un terme \ 3, où un élément est la liste de deux autres. Donc, vous ne pouvez pas utiliser un opérateur à deux positions dans ce cas. BTW, vous ne pouvez pas utiliser est dans cette situation, car il est utilisé uniquement dans les cas arithmétiques.

+1

Il est inutile de déclarer un opérateur dans votre exemple. Vous avez déclaré un opérateur 2 arguments (++>/2) mais défini un argument 3 arguments (++>/3) – gusbro

+1

A droite, alors déclarons un opérateur 3place –

0

Est-ce que ce travail pour vous:

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

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

[a,b,c] est juste du sucre syntaxique pour '.'(a,'.'(b,'.'(c)))). Ainsi, vous pouvez définir votre opérateur la même chose et d'écrire un prédicat de conversion:

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

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

Exemple:

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