2010-11-09 22 views
1

Je m'intéresse aux formules composées de nombreuses conjonctions (faisant partie d'un problème plus important). Je veux écrire un programme qui prend quelque chose comme ceci:Recherche de structures Prolog

:- get_params(conj(conj(a,b),c),X)

et retourne une liste de tous les paramètres des conjonctions à savoir X=[a,b,c]. En ce moment, je peux faire

:- get_params(conj(a,b),X) pour obtenir X=[a,b]

utilisant modèle Prolog simples correspondant, mais comment voulez-vous aller à faire des choses telles que

:- get_params(conj(conj(a,b),c),X) pour obtenir X=[a,b,c]

Il semble très simple, mais J'ai lutté toute la journée!

Répondre

2

Si l'on suppose que tous les foncteurs conj sont binaires:

get_params(X, Y, L) :- 
    get_params(X, L1), 
    get_params(Y, L2), 
    append(L1, L2, L). 
get_params(conj(X, Y), L) :- 
    get_params(X, Y, L), !. 
get_params(A, [A]). 
+0

Vous avez aucune idée Comme c'était compliqué de le faire, c'est tellement simple. Je vous remercie :). – ale

+0

De rien. Ne laissez pas le sentiment vaudou de Prolog de vous jeter de votre piste. C'est généralement très simple. Par exemple, les foncteurs sont simplement des structures de données étiquetées, comme vous pouvez le voir. –

4

Puisque vous décrivez une liste, pensez à utiliser la notation DCG:

params(conj(A,B)) --> !, params(A), params(B). 
params(X)   --> [X]. 

Exemple:

?- phrase(params(conj(conj(a,b),c)), Ps). 
Ps = [a, b, c].