2010-12-05 13 views

Répondre

2

Il est impossible, parce que vous pouvez choisir Y être tout ce que vous voulez et les calculer Z ou vice versa.

Bien que si vous savez que Y et Z sont de quelque nombre limité (par exemple des nombres entiers positifs inférieur à 5), vous pouvez faire quelque chose comme:

valid_number(1). 
valid_number(2). 
valid_number(3). 
valid_number(4). 

test(X, Y, Z) :- valid_number(Y), valid_number(Z), X is Y + Z. 
+1

Ces contraintes d'ensemble peuvent également être obtenues avec 'entre/3'. –

+0

Oui. J'ai trouvé ce entre (I, J, J): - J> = I. entre (I, J, K): - J> I, J1 est J - 1, entre (I, J1, K). ? - entre (1, 4, X). X = 4; X = 3; X = 2; X = 1; false. C'était très utile. – Martynas

3

Vous devez les transmettre comme arguments. L'arithmétique Prolog (is/2) n'est pas une baguette magique, son bon argument doit être entièrement instancié (pas de variables) avant de pouvoir être évalué. Si vous voulez que le prédicat fonctionne dans plusieurs "directions", avec plusieurs combinaisons de termes de base et de variables, vous devez utiliser la programmation logique de contraintes, mais c'est un domaine plutôt avancé de la programmation logique. Dans CLP sur les domaines finis, vous pouvez dire

:- use_module(library(clpfd)). % this differs between implementations 
test(X,Y,Z) :- X #= Y + Z. 
+1

I deuxième suggestion contrainte larsmans et trouver qui est beaucoup plus facile comprendre pour les débutants que l'arithmétique modérée de bas niveau. À mon avis, is/2 devrait être éliminé des cours d'introduction parce qu'il est trop difficile à comprendre pour les débutants. – mat

Questions connexes