2010-10-24 2 views
1

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

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

I've получил факты:

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

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

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

Я чувствую себя неадекватным из-за моей не зная никакого Пролог. Это нормально? – JAL

ответ

1

Вы можете сделать это следующим образом:

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

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

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

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

Спасибо, эта объединенный предмет работал. Сохранение не так много – shaungus

Смежные вопросы