Пролог - назови правило фактом - PullRequest
1 голос
/ 24 октября 2010

TL; DR: нужна помощь, чтобы вызвать правило с фактом
Я начал с Пролога, пришел из Си и начал работать ... пока они, очевидно, не сломались.Я пишу небольшую программу по окраске автомобилей для себя, поскольку я изучаю этот новый язык

Я пытаюсь назвать правило с фактом (возможно ли это?), Что я хочу сделать, этоиспользуйте один факт «автомобили» и другой факт «краска», чтобы составить один большой список, состоящий из всех автомобилей всех разных красок.У меня проблемы с тем, чтобы заставить код работать так, как я хочу ... посмотрите

У меня есть факты:

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

Так что я думаю, что мне нужна помощь в решении двух проблем:

  • Как передать содержимое фактов машин и красок в две петли?
  • «Гараж» для размещения всех комбинаций. Гараж - это большой список, состоящий из небольших списков из 2 предметов (машина и краска).

1 Ответ

1 голос
/ 24 октября 2010

Вы можете сделать это так:

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

Сначала «назначьте» (я думаю, это называется «унифицировать» в терминологии Пролога) список автомобилей для переменной C, а затем вызовите loop_cars для этого списка. Аналогично с красками.

Если вы хотите сохранить результат в переменной, вы должны добавить параметр «output» к вашим предикатам:

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