Je voudrais connaître la différence entre ces termes :
- faits
- foncteur
- prédicat.
- règle
en Prolog.
si j'écris: frère(john, jack).
est-ce un fait? ou un prédicat?
Je voudrais connaître la différence entre ces termes :
en Prolog.
si j'écris: frère(john, jack).
est-ce un fait? ou un prédicat?
Pour répondre à votre exemple donné :
frère(john, jack).
^ ^ ^
foncteur | |
argument |
argument
\________ ________/
\/
fait/prédicat
frère/2
est à la fois un prédicat et un fait (voir 3.72 fait dans la citation de @GuyCoder de la norme) car vous pouvez l'écrire comme une clause avec un corps qui se compose du seul but true
:
frère(john, jack) :- % <- tête de la clause
true. % <- corps de la clause
Le prédicat frère
dans votre exemple a deux arguments, donc l'arité 2 et est appelé frère/2 (voir 3.129 prédicat dans le message de @GuyCoder). Le nom ou identifiant du prédicat frère/2 est également appelé le foncteur du prédicat (voir 3.77 foncteur; notez que 3.77 et 3.129 utilisent la même définition). Vous pouvez considérer un fait comme un type spécial de prédicat que vous pouvez définir sans règles.
Si vous aviez quelques faits parent_de/2
et mâle/2
et définissiez un prédicat frère_de/2
basé sur ceux-ci, par exemple...
frère_de(X,Y) :- % X est frère de Y si
dif(X,Y), % X et Y sont différents ET
mâle(X), % X est un homme ET
parent_de(P,X), % X a un parent P ET
parent_de(P,Y). % Y a le même parent P
... alors la définition ci-dessus constitue une règle car le corps de la clause n'est pas le but true
(voir 3.154 règle). La règle ci-dessus se compose des parties suivantes :
frère_de(X,Y) :- % tête de la règle
dif(X,Y), % but \
mâle(X), % but \ corps de
parent_de(P,X), % but / la règle
parent_de(P,Y). % but /
La tête de la règle est suivie de :-
qui est une flèche d'implication pointant vers la tête de la règle et les buts sont séparés par ,
qui est un ET logique (conjonction). Ainsi, le corps d'une règle se compose d'un seul but ou d'une conjonction de buts et le corps d'une règle implique la tête de la règle. Ainsi, vous pouvez lire la définition ci-dessus de frère_de/2 comme une formule logique :
frère_de(X,Y)
← dif(X,Y)
∧ mâle(X)
∧ parent_de(P,X)
∧ parent_de(P,Y)
Si vous venez de la logique mathématique, vous trouverez peut-être utile de rappeler qu'un prédicat est défini comme une fonction à valeurs booléennes, c'est-à-dire une fonction qui mappe ses arguments à true ou false. Ainsi, un prédicat est la fonction caractéristique d'une relation (voir Prédicat (logique mathématique). Comme vous pouvez interroger des faits et obtenir true
/false
comme réponse, ils constituent des prédicats. Vous pouvez le voir lorsque vous interrogez votre définition de frère/2 :
?- frère(john,jack).
true. % <- mappe à true
?- frère(john,jason).
false. % <- mappe à false
Si vous émettez des requêtes avec des variables, vous obtenez des substitutions pour ces variables qui rendent le prédicat vrai au lieu de la réponse true
, par exemple :
?- frère(X,Y).
X = john, % ces substitutions pour X et Y
Y = jack. % mappent à true
Une remarque finale : En parlant de Prolog, les termes prédicat et relation sont souvent utilisés de manière interchangeable et il est très utile de penser à écrire des prédicats comme à décrire des relations (voir les commentaires dans la définition de frère_de/2 ci-dessus). Par conséquent, pour les requêtes ci-dessus, il est également approprié de dire : La relation frère(john,jack)
est vérifiée. La relation frère(john,jason)
n'est pas vérifiée. La relation frère(X,Y)
est vérifiée pour les substitutions X=john
et Y=jack
.
De
ISO/IEC 13211-1 Première édition 1995-06-01
Technologie de l'information - Langages de programmation - Prolog -
Partie 1:
Noyau général
3.9 arité: Le nombre d'arguments d'un terme composé. Syntaxiquement, un entier non négatif associé à un foncteur ou prédicat.
3.19 corps : Un but, distingué par son contexte en tant que partie d'une règle (voir 3.154).
3.32 clause: Un fait ou une règle. Il a deux parties: une tête, et un corps.
3.37 terme composé: Un foncteur d'arité N, N positif, avec une séquence de N arguments.
3.72 fait: Une clause dont le corps est le but vrai.
NOTE - Un fait peut être représenté en texte Prolog par un terme dont le foncteur principal n'est ni (:-)/1
ni (:-)/2
.
3.77 foncteur: Un identificateur avec une arité.
3.81 but: Une prédication qui doit être exécutée (voir corps, requête, et 7.7.3).
3.84 tête (d'une règle): Une prédication, distinguée par son contexte.
3.88 identificateur: Un objet de base non structuré utilisé pour désigner un atome, un nom de foncteur ou un nom de prédicat.
3.129 prédicat: Un identificateur avec une arité.
3.133 prédication: Un prédicat avec une arité N et une séquence de N arguments.
3.143 requête: Un but donné en entrée interactive au niveau supérieur.
3.154 règle: Une clause dont le corps n'est pas le but vrai. Pendant l'exécution, si le corps est vrai pour une substitution donnée, alors la tête est également vrai pour cette substitution. Une règle est représentée en texte Prolog par un terme dont le foncteur principal est (:-)/2
où le premier argument est converti en tête, et le deuxième argument est converti en corps.
Donc brother(john, jack).
est un fait.
La différence entre un terme et un prédicat (ou but) peut être subtile. Ils se ressemblent et sont distingués par le contexte. Par exemple:
foo(1).
foo(2).
foo_results(Résultats) :- setof(X, foo(X), Résultats).
?- foo_results(Résultats).
Résultats = [1, 2].
Le prédicat foo/1
a deux clauses. Le prédicat foo_results/1
appelle cela, mais indirectement ... le méta-prédicat setof/3
prend un terme comme deuxième argument, qu'il interprète comme un prédicat. En d'autres termes, un foncteur (nom/arité) est le squelette d'un type de terme; certains méta-prédicats (par ex., call/1
, setof/3
, etc.) peuvent interpréter un terme (foncteur/arité) comme un prédicat.
Un fait est une expression prédicative qui fait une déclaration déclarative sur le domaine du problème.
likes(john, mary).
Une règle est une expression prédicative qui utilise une implication logique (:-) pour décrire une relation entre les faits. Une règle pourrait être
left :- right.
friends(X,Y) :- likes(X,Y),likes(Y,X).
Les faits et les règles sont tous deux des prédicats.
Donc, pour votre question, frère(john, jack) est un fait.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Aussi, SWI Prolog a une bonne page avec le glossaire : swi-prolog.org/pldoc/man?section=glossary
2 votes
Peut-être une duplication de Ce terme Prolog est-il correct ?
1 votes
FYI Lorsque l'OP a posé la question, la définition de
functor
n'était pas dans Ce langage de programmation est-il correct?. Après avoir vu la question, j'ai mis à jour l'autre réponse avec la définition defunctor
. Donc, avec les mises à jour, c'est une question en double, mais ce n'était pas de la faute de l'OP.