Oui. Tout d'abord vous n'avez pas besoin d'utiliser member/2
pour les faits. Vous pouvez lister ces faits comme:
dayname(1,'Monday').
dayname(2,'Tuesday').
dayname(3,'Wednesday').
dayname(4,'Thursday').
dayname(5,'Friday').
dayname(6,'Saturday').
dayname(7,'Sunday').
Mais maintenant, nous avons bien sûr aucun moyen d'obtenir 'Monday'
pour 8. Probablement le plus déclarative façon de le faire est la clause suivante:
:- use_module(library(clpfd)).
dayname(I,D) :-
I in 8..31,
J #= I-7,
dayname(J,D).
Mettre cette tous ensemble, nous obtenons:
:- use_module(library(clpfd)).
dayname(1,'Monday').
dayname(2,'Tuesday').
dayname(3,'Wednesday').
dayname(4,'Thursday').
dayname(5,'Friday').
dayname(6,'Saturday').
dayname(7,'Sunday').
dayname(I,D) :-
I in 8..31,
J #= I-7,
dayname(J,D).
nous QUERY alors de toutes les manières possibles:
?- dayname(I,D).
I = 1,
D = 'Monday' ;
I = 2,
D = 'Tuesday' ;
I = 3,
D = 'Wednesday' ;
I = 4,
D = 'Thursday' ;
I = 5,
D = 'Friday' ;
I = 6,
D = 'Saturday' ;
I = 7,
D = 'Sunday' ;
I = 8,
D = 'Monday' ;
I = 9,
D = 'Tuesday' ;
I = 10,
D = 'Wednesday' ;
I = 11,
D = 'Thursday' ;
I = 12,
D = 'Friday' ;
I = 13,
D = 'Saturday' ;
I = 14,
D = 'Sunday' ;
I = 15,
D = 'Monday' ;
I = 16,
D = 'Tuesday' ;
I = 17,
D = 'Wednesday' ;
I = 18,
D = 'Thursday' ;
I = 19,
D = 'Friday' ;
I = 20,
D = 'Saturday' ;
I = 21,
D = 'Sunday' ;
I = 22,
D = 'Monday' ;
I = 23,
D = 'Tuesday' ;
I = 24,
D = 'Wednesday' ;
I = 25,
D = 'Thursday' ;
I = 26,
D = 'Friday' ;
I = 27,
D = 'Saturday' ;
I = 28,
D = 'Sunday' ;
I = 29,
D = 'Monday' ;
I = 30,
D = 'Tuesday' ;
I = 31,
D = 'Wednesday' ;
false.
?- dayname(15,D).
D = 'Monday' ;
false.
?- dayname(I,'Thursday').
I = 4 ;
I = 11 ;
I = 18 ;
I = 25 ;
false.
?- dayname(12,'Thursday').
false.
?- dayname(11,'Thursday').
true ;
false.
Cela ressemble à des devoirs ... –