Pregunta

TL; DR: Ayuda de la necesidad de llamar una regla con un hecho
He comenzó con Prolog, que viene de C y consiguió trabajo cosas ... hasta que, evidentemente, se rompieron. Estoy escribiendo un pequeño programa alquiler-pintura para mí mismo como estoy aprendiendo este nuevo lenguaje

Estoy intentando llamar una regla con un hecho (¿es esto posible?), Lo que quiero hacer es usar "coches" un hecho y otro hecho de "pintar" para hacer una gran lista que consiste en todos los coches en todas las diferentes pinturas. Estoy teniendo problemas para hacer que el código funcione como yo quiero ... echar un vistazo

he consiguió los hechos:

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).  

Así que supongo que necesita ayuda para resolver dos problemas:

  • ¿Cómo pasar el contenido de los coches hechos y pinturas a los dos bucles?
  • A "garaje" para poner todas las combinaciones en. Garaje siendo una gran lista que consiste en pequeñas 2-items-listas (el de automóviles y pintura).
¿Fue útil?

Solución

Puede hacerlo de esta manera:

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

En primer lugar, “Asignar” (creo que se llama “unificar” en la terminología de Prolog) la lista de coches a la C variable y loop_cars entonces llamada para esta lista. Del mismo modo con las pinturas.

Si desea almacenar el resultado en una variable, hay que añadir una parametr “salida” a sus predicados:

loop_paints(_,[],[]).  
loop_paints(Ca,[Pa|Rest],[Res|ResRest]):-
    Res = [Ca,Pa],
    loop_paints(Ca,Rest,ResRest).
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top