【问题标题】:Prolog - call a rule with factProlog - 用事实调用规则
【发布时间】:2011-04-29 17:36:43
【问题描述】:

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

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

  • 如何将事实汽车和油漆的内容传递给两个循环?
  • 一个“车库”,用于放置所有组合。车库是一个大列表,由两个小项目列表(汽车和油漆)组成。

【问题讨论】:

  • 我对Prolog一无所知,感觉不够用。这正常吗?

标签: prolog rule fact


【解决方案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).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多