2011-09-28 4 views
3

tous.Affectation booléenne dans Prolog

Je souhaite attribuer une valeur booléenne à une variable.

J'ai essayé des trucs comme.

Diagonal is (XPiece = XFinal) 
Diagonal is (XPiece =:= XFinal) 
Diagonal is (XPiece is XFinal) 

travail Aucun ...

Toute solution?

+0

Où se trouve le support gauche fermé dans '\ + (diagonale (FormerX, X),' – Jiri

+0

Got it Merci –

Répondre

3

le prédicat is/2 intégré de Prolog évalue le côté droit de l'expression comme une expression arithmétique et unifie le résultat avec le côté gauche.

En outre, prolog n'a pas de type booléen. Les types intégrés de Prolog sont

  • entier
  • flotteur
  • atome
  • composé de variable
  • non lié terme

Vous pouvez choisir de représenter une valeur booléenne comme les atomes true/false (utile pour la lisibilité), ou vous pouvez représenter une valeur booléenne comme valeurs entières 1/0 (utile pour le calcul). La façon dont la plupart des langages procéduraux, comme C, évaluent les valeurs arithmétiques comme des booléens est la logique formelle WRT cassée, cependant: la fausseté est à valeur unique (0) et la vérité à valeurs multiples (non nul), ce qui n'est pas faux. Dans la logique formelle, la vérité est à valeur unique et la fausseté est définie comme ce qui n'est pas vrai. Donc, vous voudrez peut-être considérer la sémantique de votre représentation et construire des prédicats pour manipuler vos booléens, en ajoutant éventuellement des opérateurs pour "prolonger" un peu le prologue.

+0

Je comprends, merci. –

1

Qu'en est-

diagonal(XPiece, XFinal) :- XPiece = XFinal. 
+0

que j'avais.! Je pensais à cela, mais je voulais que la valeur soit calculée dans ce prédicat particulier avant d'être transmise au prédicat auquel elle sera envoyée –

+0

@Francisco: Pourriez-vous donner plus de contexte? – Jiri

+0

Oui, je réalise que ma question manquait là-dessus. Juste une seconde –

3

Utilisez un if-then-else:

(XPiece = XFinal -> 
    Diagonal = true 
; 
    Diagonal = false 
) 

ou utiliser 1/0, ou tout ce que vous voulez. Vous pouvez également utiliser CLP (FD), qui prend en charge l'idiome que vous voulez:

use_module(library(clpfd)). 

diag(XPiece, XFinal, Diagonal) :- 
    Diagonal #= (XPiece #= XFinal).