Recherche…


Disjonction (OU logique), implicite vs explicite

Prolog essaie des clauses alternatives pour un prédicat dans l'ordre d'apparition:

likes(alice, music).
likes(bob, hiking).

// Either alice likes music, or bob likes hiking will succeed.

L'opérateur de disjonction (OR) ; peut être utilisé pour exprimer ceci dans une règle:

likes(P,Q) :-
    ( P = alice , Q = music ) ; ( P = bob , Q = hiking ).

Les parenthèses sont importantes ici pour plus de clarté. Voir cette question sur la , ; préséance relative pour la conjonction , et disjonction ; .

Conjonction (ET logique)

La conjonction (ET logique) est représentée par la virgule , opérateur (entre autres rôles).

La conjonction entre les clauses peut apparaître dans une requête:

?- X = 1, Y = 2.

La conjonction peut également apparaître entre les clauses sous-jacent du corps d'une règle:

triangleSides(X,Y,Z) :-
    X + Y > Z, X + Z > Y, Y + Z > X.

Couper (supprimer les points de choix)

Parfois, il est souhaitable d'empêcher Prolog de revenir en arrière dans des solutions alternatives. L'outil de base à la disposition du programmeur pour empêcher Prolog de continuer à se poursuivre dans son backtrack est l'opérateur cut. considérer ce qui suit.

% (percent signs mean comments)
% a is the parent of b, c, and d.
parent(a,b).
parent(a,c).
parent(a,d).

Ici, le prédicat parent/2 réussit plus d’une fois lorsque

?- parent(a,X).

est appelé. Pour empêcher Prolog de rechercher d'autres solutions après la découverte du premier, vous devez utiliser l'opérateur cut, comme ceci.

?- parent(a,X), !.

Cela aura X égal à b (car c'est la première solution possible) et ne cherche plus de solutions.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow