TL; DR:需要帮助调用具有事实的规则
我从Prolog开始,来自C并开始工作......直到他们明显被打破。我正在为自己写一个小型汽车涂装程序,因为我正在学习这门新语言
我试图用一个事实来调用一个规则(这可能吗?),我想要做的是使用一个事实“汽车”和另一个事实“画”来制作一个包含所有汽车的大清单所有不同的油漆。我无法按照我的意愿使代码工作......看看
我有事实:
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 :(得分:1)
你可以这样做:
start :- cars(C), loop_cars(C).
首先,“分配”(我认为它在Prolog术语中称为“统一”)变量C
的汽车列表,然后为此列表调用loop_cars
。与涂料类似。
如果要将结果存储在变量中,则必须在谓词中添加“输出”参数:
loop_paints(_,[],[]).
loop_paints(Ca,[Pa|Rest],[Res|ResRest]):-
Res = [Ca,Pa],
loop_paints(Ca,Rest,ResRest).