2011-11-27 8 views

Répondre

4

Quand on veut donner des informations sur un prédicat Prolog, ces conventions sont souvent utilisées:

arité: prédicat/3 signifie prédicat prend 3 arguments.

paramètres: predicate (+ Element, + List, -Result) signifie que Element et List ne doivent pas être des variables libres et que Result doit être une variable libre pour que le prédicat fonctionne correctement. ? est utilisé quand il peut être les deux, @ est mentionné sur la réponse ci-dessus mais n'est pas vraiment utilisé autant (au moins dans swi-pl doc) et signifie que l'entrée ne sera pas liée pendant l'appel.

si disant que somepredicate fonctionne en +, + mode est un raccourci pour dire que:

% somepredicate/2 : somepredicate(+Input1, +Input2) 
3

Cela signifie que les arguments du prédicat seront tous les deux des arguments d'entrée (mais pas une entrée pure).

This page a une description succint de tous les modes d'appel de Prolog.

4

Afin de vous donner une réponse définitive, vous devez nous dire plus que +, +. Pour les prédicats dont les arguments ne sont que des atomes, les choses sont bien définies: p (+, +) signifie que le prédicat ne doit être appelé que si les deux arguments sont des atomes. Mais si nous avons, disons des listes, les choses sont plus complexes. Il y a deux significations dans ce cas. Considérons member/2 qui succède à member(2,[1,2,3]).

Les requêtes member(2,[X]) ou member(2,[X|Xs]) sont-elles maintenant +, + ou non?

L'interprétation directe qui est également utilisé dans la norme ISO Prolog dit que (citant 8.1.2.2 mode d'un argument, de la norme ISO/CEI 13211-1: 1995):

  • + l'argument doit être instancié,

Dans ce sens, les deux requêtes ci-dessus sont +, +. Cependant, il existe une autre interprétation qui suppose implicitement que nous avons accès à la définition du prédicat. Cette interprétation provient des déclarations de mode de DEC-10 Prolog, l'un des premiers systèmes Prolog. permet donc regarder à member/2:

member(X, [X|_]). 
member(X, [_|Xs]) :- 
    member(X, Xs). 

Un mode member(+,+) serait maintenant dire que lors de l'exécution d'un but, ce mode pour tenir tous sous-buts. Cela signifie que member(2,[X]) serait +, + alors que member(2,[X|Xs]) est et non en raison de son sous-objectif member(2,Xs).

Les gens confondent assez souvent ces notions. Donc, quand vous parlez de listes ou d'autres termes composés, il est utile de demander ce que l'on veut dire.

Pour plus d'informations sur les modes, voir this answer.