2010-10-24 62 views
1

TL的规则; DR:需要帮助调用规则与事实
从来就开始了序言,由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). 

所以我想我需要帮助解决两个问题:

  • 我如何将事实汽车和涂料的内容传递给两个循环?
  • 一个“车库”,把所有的组合。车库是一个大列表组成的小2项目列表(汽车和油漆)。
+0

我,由于我不知道任何的Prolog觉得不够用。这是正常的吗? – JAL 2010-10-24 01:13:06

回答

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 2010-10-24 20:54:01