2011-05-04 7 views
0

Je me demandais comment faire la réponse (ou première fonction) à cette question dans Prolog en utilisant un seul prédicat? Le lien auquel je fais référence est here.Comment faire cela en une seule fonction

Voici un exemple de ce que je veux dire que par appeler un prédicat:

reverse([X|Y],Z,W) :- reverse(Y,[X|Z],W). 
reverse([],X,X). 
+0

Que voulez-vous dire? Je ne vois qu'une seule "fonction" dans la réponse que vous avez liée. Bien qu'il existe deux versions de celui-ci. BTW, quand vous dites "fonction", je suppose que vous voulez dire "prédicat". – svick

+0

Ouais, je suis désolé, je veux dire prédicat et que je veux être en mesure de comprendre comment l'appeler seulement le prédicat. – Abriel

+0

Je ne comprends toujours pas ce que vous voulez dire. Pourriez-vous élaborer? Peut-être fournir un exemple? – svick

Répondre

0

Qu'est-ce que vous essayez de faire et pourquoi voulez-vous juste une clause pour le prédicat?
personnellement je crois qu'avoir la possibilité d'écrire de nombreuses clauses est l'une des grandes choses de prolog et le code est plus élégant et lisible de cette façon

Quoi qu'il en soit, vous voudrez probablement utiliser ou. en supposant que vous avez les clauses suivantes: (! bye bye ltrage il)

foo(Arg11,Arg12,Arg13):- 
    (Body1). 

foo(Arg21,Arg22,Arg23):- 
    (Body2). 

foo(Arg31,Arg32,Arg33):- 
    (Body3). 

vous devez d'abord vous assurer que chaque article a les mêmes arguments:

foo(Arg1,Arg2,Arg3):- 
     (Body1b). 
foo(Arg1,Arg2,Arg3):- 
     (Body2b). 
foo(Arg1,Arg2,Arg3):- 
     (Body3b). 

et vous utiliserez ou (;):

foo(Arg1,Arg2,Arg3):- 
    (Body1b) 
    ; (Body2b) 
    ; (Body3b). 

par exemple,

reverse([X|Y],Z,W):- 
    reverse(Y,[X|Z],W). 
reverse([],X,X). 

deviendront:

reverse(X,Y,Z):- 
    X = [H|T], 
    reverse(T,[H|Y],X). 
reverse(X,Y,Z):- 
    X = [], 
    Z = Y. 

puis:

reverse(X,Y,Z):- 
    (X = [H|T], 
    reverse(T,[H|Y],X)) 
    ; (X = [], 
     Z = Y). *%ew ew ugly!* 

en ce qui concerne l'exemple sur votre premier poste, il y a deux prédicats différents, chacun ayant un seul article. le deuxième prédicat a 2 arguments alors que le premier a 1 donc ils sont différents. La seule façon de les "fusionner" serait d'appeler simplement le second has_equal_sums (List, _) à la place du premier.

Pour être honnête, je ne vois pas l'intérêt de le faire; Je doute que vous n'obtiendrez pas d'accélération significative et le code devient beaucoup plus désordonné.
Bien sûr, c'est votre code et il peut y avoir des restrictions que nous ne connaissons pas (c'est pourquoi j'ai demandé ce que vous voulez accomplir)

+0

Je comprends tout à fait où vous venez et il est probablement messier. Je voulais juste être en mesure de trouver un moyen où il fonctionnerait même mais seulement appeler utiliser l'un prédicat que l'appel principal. – Abriel

+0

Si je comprends bien la question, il ne s'agit pas d'avoir une seule clause pour un prédicat, mais d'utiliser un seul prédicat (éventuellement avec plusieurs clauses). Naturellement, une telle contrainte artificielle sur la mise en œuvre risquerait d'être difficile à lire pour un humain. – hardmath

+1

huum, un prédicat, plusieurs clauses ... nous pourrions utiliser un prédicat "maître", myprogram/2. le premier argument serait le nom du prédicat et le second une liste d'arguments.quelque chose comme myprogram (père, [john, kevin]). myprogram (mère, (liz, kevin)] myprogram (grand-père, [X, Y]): - père (X, Z), père (Z, Y) et ensuite nous pourrions utiliser ou et les mettre tous dans une clause LOL –