如何在序言中加入规则并打印输出 [英] How to join rules and print out outputs in prolog

查看:51
本文介绍了如何在序言中加入规则并打印输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下事实清单.

items(itemId('P01'),prodName('Pots'),stockQty(50),price(8200)).
items(itemId('P02'),prodName('Pans'),stockQty(50),price(400)).
items(itemId('P03'),prodName('Spoons'),stockQty(50),price(200)).
items(itemId('P04'),prodName('Forks'),stockQty(50),price(120)).
items(itemId('P05'),prodName('Kettles'),stockQty(50),price(500)).
items(itemId('P06'),prodName('Plates'),stockQty(50),price(60)).

当给出像 print_all_products. 这样的命令时,如何在控制台上打印如下内容.

How to print on the console something like the following when a command like print_all_products. is given.

................

..............

可用产品

.........

名称数量

锅 60

平底锅 50

勺子 40

.................

..................

  • 名称和数量必须以表格结构正确格式化.
  • 我尝试使用 forallforeach 我没有成功生成我需要的东西.

    I tried using forall and foreach I am unsuccessful in generating what i need.

    推荐答案

    更多细节的答案已发布 此处.以下是代码,因此这不仅仅是链接答案.

    Answer with more details is posted here. Below is the code so that this is not a link only answer.

    items(itemId('P01'),prodName('Pots'),stockOty(50),price(8200)).
    items(itemId('P02'),prodName('Pans'),stockOty(50),price(400)).
    items(itemId('P03'),prodName('Spoons'),stockOty(50),price(200)).
    items(itemId('P04'),prodName('Forks'),stockOty(50),price(120)).
    items(itemId('P05'),prodName('Kettles'),stockOty(50),price(500)).
    items(itemId('P06'),prodName('Plates'),stockOty(50),price(60)).
    
    header("\n........................\nAvailable Products\n........................\nName   Qty\n").
    footer("........................\n").
    
    spaces(Length,Spaces) :-
        length(List,Length),
        maplist([_,0'\s]>>true,List,Codes),
        string_codes(Spaces,Codes).
    
    padded_string(String,Width,Padded_string) :-
        string_length(String,String_length),
        Padding_length is Width - String_length,
        spaces(Padding_length,Padding),
        atom_concat(String,Padding,Padded_string).
    
    format_detail_line(item(Name,Quantity),width(Name_width),Formatted_item) :-
        padded_string(Name,Name_width,Padded_name),
        atom_concat(Padded_name,Quantity,Formatted_item).
    
    add_detail_line(width(Name_Width),Item,Lines0,Lines) :-
        format_detail_line(Item,width(Name_Width),Formatted_item),
        atomic_list_concat([Lines0,Formatted_item,"\n"], Lines).
    
    items_detail(Detail) :-
        findall(item(Name,Quantity),items(_,prodName(Name),stockOty(Quantity),_),Items),
        aggregate_all(max(Width),Width,(items(_,prodName(Name),_,_),string_length(Name,Width)),Name_Width),
        Name_field_width is Name_Width + 1,
        foldl(add_detail_line(width(Name_field_width)),Items,"",Detail).
    
    print_all_products(Report) :-
        header(Header),
        items_detail(Detail),
        footer(Footer),
        atomic_list_concat([Header,Detail,Footer], Report).
    
    print_all_products :-
        print_all_products(Report),
        write(Report).
    
    :- begin_tests(formatted_report).
    
    test(1) :-
        print_all_products(Report),
        with_output_to(atom(Atom),write(Report)),
        assertion( Atom == '\n........................\nAvailable Products\n........................\nName   Qty\nPots    50\nPans    50\nSpoons  50\nForks   50\nKettles 50\nPlates  50\n........................\n' ).
    
    :- end_tests(formatted_report).
    


    注意:Peter 给出的 answer 是进行格式化的惯用方式,但正如我所指出的,这会驱动我疯了.即便如此,这也是我在生产环境中的做法.


    Note: The answer given by Peter is the customary way to do the formatting, but as I noted, that drives me nuts. Even so, that is the way I would do it in a production environment.

    我给出这个答案是因为 OP 指出他们正在寻找一种使用诸如 forall/2 或 foreach/2 之类的谓词来做到这一点的方法.当然,本答案中未使用它们中的任何一个,但使用了使用更实用的方法的意图.

    I gave this answer because the OP noted they were looking for a way to do it using predicates like forall/2 or foreach/2. Granted neither of them is used in this answer but the intent of using a more functional approach is used.

    如果问题更开放,我会使用 DCG 给出答案.

    If the question was more open ended I would have given a answer using DCGs.

    这篇关于如何在序言中加入规则并打印输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆