Bonsoir à tous,
je vous expose mon problème. L'on m'a donné une source Prolog partiel permettant de geler et dégeler un terme. Code sans doute destiné à réaliser des opérations concurrentes ou alors traiter d'une façon particulière une opération récursive. Je ne sais pas trop encore vu que je ne comprend pas tout ce code...
Mon souci est le suivant : plusieurs points de la syntaxe m'échappent et donc je suis incapable d'en comprendre le fonctionnement et mes multiples recherches sur internet n'ont rien donné
Je viens donc ici avec l'espoir que quelqu'un peut m'éclairer.
Voici le source :
la première chose qui me gène est '$tmp'(X) et '$VAR'(N).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 %gel.pl %gel et degel d'un terme %clone/2 %clone(X,Y):-assert('$tmp'(X)),retract('$tmp'(Y)). %gel/2 gel(X,Y):-clone(X,Y),nbvars(X,0,N). %degel/2 degel(X,Y):-degel(X,Y,Dico). %degel/3 degel('$VAR'(N),X,Dico):-!,lookup(N,Dico,X). degel(X,Y,Dico):-atomic(X),!. degel(X,Y,Dico):- nonvar(X), non atomic(X), functor(X,F,N), functor(Y,F,N), degel(N,X,Y,Dico). %degel/4 degel(N,X,Y,Dico):- N>0, arg(N,X,ArgX), degel(ArgX,ArgY,Dico), arg(N,Y,ArgY), N1 is N-1, degel(N1,X,Y,Dico). degel(0,X,Y,Dico). %lookup/3 lookup(Cle,d(Cle,X,Droit,Gauche),Val):-!,X=Val. lookup(Cle,d(Cle1,X,Droit,Gauche),Val):- Cle @< Cle1, !, lookup(Cle,Gauche,Val). lookup(Cle,d(Cle1,X,Droit,Gauche),Val):- Cle @> Cle1, !, lookup(Cle,Droit,Val). %nbvars/3 nbvars('$VAR'(N),N,N1):-N1 is N+1. nbvars(Terme,N1,N2):- nonvar(Terme), functor(Terme,F,N), nbvars(0,N,Terme,N1,N2). %nbvars/5 nbvars(N,N,Terme,N1,N1). nbvars(I,N,Terme,N1,N3):- I<N, I1 is I+1, arg(I1,Terme,Arg), nbvars(Arg,N1,N2), nbvars(I1,N,Terme,N2,N3).
De plus ces 2 termes n'apparaissent pas dans la base de connaissance au listing, même après avoir fait plusieurs appels à clone(X,Y) par exemple.
J'ai encore plusieurs questions que je poserai plus tard si vous etes inspirés par cette source ^^; , euh si dernière question pour ce post, à quoi peut bien servir la variable Y dans l'appel de clone(X,Y) ?
Partager