2013-08-03 4 views
4

J'essaye de construire un programme de planification scolaire en prologue. Je veux vérifier si un enseignant est disponible à un moment donné pour enseigner un certain cours de cette classe; vérifier les créneaux horaires admissibles; etc.School Scheduling (Constrained Logic)

Voici ce que j'ai pu écrire à ce jour:

teacher(ali, bio). 
teacher(sara, math). 
teacher(john, lit). 
teacher(milton, arabic). 

% a, b, c, d, e, f, g 
timeslot(a). 
timeslot(b). 

% class has a name and a grade 
class(bio, 1). 
class(math, 1). 
class(lit, 2). 
class(arabic, 2). 

Comment puis-je établir qu'une classe ne peut pas avoir deux intervalles de temps?

J'ai utilisé un peu de Prolog, mais je ne suis pas sûr de la marche à suivre. D'autres conseils et indications, comme des documents ou des problèmes similaires qui sont résolus plus fréquemment, seraient appréciés.

+0

Construire un petit exemple avec deux enseignants et trois ou quatre entrées de calendrier; puis définissez quelques vérités et construisez des instructions qui contiennent de véritables ensembles de conditions.Après cela, postez ce que vous avez trouvé, et les autres seront heureux de vous aider dans tout ce que vous pourriez être coincé. – Rubens

+1

Merci! Je viens d'ajouter plus de détails! –

+3

Veuillez donner un exemple de ce que vous voulez que la sortie soit. Quelle est la pertinence de la note et de l'intervalle de temps? –

Répondre

0

J'ai écrit il y a deux ans un programme de planification pour centre d'évaluation et utilisé clpfd pour cela parce qu'en swi-prolog normal ce serait beaucoup plus compliqué et le problème est exponentiel avec la complexité donc si vous avez une vraie école avec beaucoup des enseignants, des lessions, etc ce ne sera pas vraiment efficace sans programmation par contraintes.

S'il vous plaît jeter un oeil int clp (fd) à swi-prolog website

Sincères salutations

solick

4

Le libellé de la Question suggère qu'un programme doit être écrit pour produire (ou au moins vérifier) ​​un horaire de cours proposé.

Les entrées du programme semblent être une liste des enseignants (et de leurs sujets), une liste des plages horaires et une liste des classes (et de leurs sujets/notes).

Il est probable qu'il existe plusieurs restrictions de "cardinalité" (parfois appelées "règles de gestion") auxquelles un programme de classe approprié doit satisfaire. Une classe ne peut être donnée qu'une seule fois (pas deux tranches de temps), mais un enseignant ne peut enseigner qu'une classe par intervalle de temps, etc.

Comment ces restrictions peuvent-elles être indiquées? Les prédicats Prolog n'ont pas de restrictions inhérentes de ce type, mais ils peuvent être implémentés structurellement ou logiquement (c'est-à-dire dans la vérification logique du programme). Un exemple de réalisation structurelle consiste à ajouter un champ au prédicat class pour représenter l'intervalle de temps attribué. Une certaine logique serait impliquée dans la façon dont ce champ est assigné, pour s'assurer que la valeur est un intervalle de temps valide. Un exemple de relation logique entre les classes et les intervalles de temps consisterait à définir un prédicat supplémentaire qui modélise l'affectation des intervalles de temps aux classes (on peut supposer que quelque chose de similaire s'applique à l'affectation des classes aux enseignants). Vous auriez, comme illustration, prédicat class_timeslot(Class,Timeslot). Les règles de votre programme imposent l'unicité de ces instances (affirmées dynamiquement) faits par instance Class et la validité de la valeur Timeslot. Alternativement, au lieu de faits dynamiques, la planification de classe pourrait être construite sous la forme d'une liste de structures présentant des classes d'appariement et des intervalles de temps similaires. Mais le point est que la logique du programme doit implémenter que cette appariement est une relation fonctionnelle.