首页 文章

Prolog - 用事实来称呼规则

提问于
浏览
1

TL;DR: Need help calling a rule with a fact
我从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).

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

  • 如何将事实汽车和油漆的内容传递给两个循环?

  • A "garage"将所有组合放入 . 车库是一个包含小型2项目列表(汽车和油漆)的大清单 .

1 回答

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

相关问题