2010-10-24 32 views
1

TL; DR: Besoin d'aide appeler une règle avec un fait
Ive a commencé avec Prolog, venant de C et a des choses à travailler ... jusqu'à ce qu'ils se sont évidemment brisées. J'écris un petit programme de peinture de voiture pour moi-même pendant que j'apprends ce nouveau langageProlog - appeler une règle fait

J'essaie d'appeler une règle avec un fait (est-ce possible?), Ce que je veux faire est d'utiliser un fait "voitures" et un autre fait "peinture" pour faire une grande liste composée de toutes les voitures dans toutes les différentes peintures. Je vais avoir du mal à faire le travail de code que je veux ... un coup d'oeil

les faits Ive a obtenu:

cars([ferrari, bmw, ford, jaguar]). 
paints([red, white, blue, yellow]). 

/*Now I wanted to loop through each car, eachtime printing 
out the different paint combinations of that car: */ 

start:- loop_cars(cars(C)). /*starts loop_cars with all the cars e.g [ferrari...]*/ 
          /*but it false here, even if C = [ferrari...]*/ 
loop_cars([]). 
loop_cars([Ca|Rest]):- 
    loop_paints(Ca,paints(P)), /*The car is sent off for a paint job,...*/ 
    loop_cars(Rest).   /*...(cont from above) same false here as before*/ 

loop_paints(_,[]). 
loop_paints(Ca,[Pa|Rest]):- /*This works*/ 
    write([Ca,Pa]), /*Writes it like "[ferrari, white] [ferrari, blue] ..."*/ 
    loop_paints(Ca,Rest). 

donc je suppose que j'ai besoin d'aide pour résoudre deux problèmes:

  • Comment puis-je transmettre le contenu des voitures de faits et peintures aux deux boucles?
  • Un "garage" pour mettre toutes les combinaisons. Garage étant une grande liste composée de petites listes de 2 articles (la voiture et la peinture).
+0

je me sens inadéquate en raison de mon ne sachant Prolog. Est-ce normal? – JAL

Répondre

1

Vous pouvez le faire comme ceci:

start :- cars(C), loop_cars(C). 

En premier lieu, « attribuer » (je pense qu'il est appelé « unifier » dans la terminologie Prolog) la liste des voitures à la C variable, puis appelez loop_cars pour cette liste. De même avec les peintures.

Si vous voulez stocker le résultat dans une variable, vous devez ajouter une « sortie » Parametr à vos prédicats:

loop_paints(_,[],[]). 
loop_paints(Ca,[Pa|Rest],[Res|ResRest]):- 
    Res = [Ca,Pa], 
    loop_paints(Ca,Rest,ResRest). 
+0

Merci, cette chose unificatrice a fonctionné. Le stockage pas tellement – shaungus