【问题标题】:How can I assign multiple values to a variable (like a string) in Prolog?如何在 Prolog 中为变量(如字符串)分配多个值?
【发布时间】:2018-04-19 05:00:57
【问题描述】:

今天早些时候我求助于在prolog中构建数据库以及如何按参数搜索,有人想出了这个:

您还可以为每个处理器添加术语列表,例如:

processor(pentium_g4400, [brand('intel'),    family('pentium'),
                          series('g4400'),   clock(3.3),
                          socket('lga1151'), ram('ddr4'),
                          cores(2),          threads(2)]).

在这种情况下,您可以查询:

processor(Proc, Specs), member(family('pentium'), Specs).

而且效果很好,但是“member”命令似乎不适用于规则:

build(ProcSpecs, RamSpecs, MoboSpecs):-
        processor(NameProc, PSpec), member(ProcSpecs, PSpec),
        component_ram(NameRam, RSpec), member(RamSpecs, RSpec),
        motherboard(NameMobo, MSpec), member(MoboSpecs, MSpec),
        write("-----------------------------"), nl, 
        write("Processor: "), write(NomeProc), nl,
        write("Ram: "), write(NomeRam), nl,
        write("Motherboard: "), write(NomeMobo), nl.

如果我这样查询:

build(ram(ddr4), ram(ddr4), ram(ddr4)).

(或放置我想搜索的任何其他参数) 它回答了我与参数匹配的组件列表(这是我正在寻找的结果)。 但是,如果我尝试使用“成员”来设置多个参数,如下所示:

build(ProcSpecs, RamSpecs, MoboSpecs), member(socket('lga1151'), ProcSpecs), member(ram('ddr4'), ProcSpecs), member(ram('ddr41'), RamSpecs), member(socket('lga1151'), MoboSpecs), member(ram('ddr4'), MoboSpecs).

它开始列出数据库中的每个组件,并且似乎发生这种情况是因为没有为变量分配任何内容。 整个数据库在这里:https://pastebin.com/1Yy6cTV9

【问题讨论】:

    标签: database variables prolog assign rule


    【解决方案1】:

    查看您的数据库文件,我认为您今天早些时候得到的建议不是正确的方向。我可能会将其作为一个直接的关系数据库来处理,使用如下表:

    % processor(Id, Brand, Family, Series, Clock, Socket, RAM, Cores, Threads).
    

    然后我会像这样重铸你制作的数据库:

    processor(pentium_g4400, intel, pentium, g4400, 3.3, lga1151, ddr4, 2, 2).
    

    这就是你对关系数据库所做的事情,我认为这也是你应该做的事情。现在,如果您只想查询一个方面,您可以按位置进行:

    ?- processor(Processor, _, pentium, _, _, _, _, _, _).
    Processor = pentium_g4400 ;
    ...
    

    然后你会对你的另外两个关系做同样的事情:

    component_ram(corsair_dominator_platinum_8gb_ddr4, corsair, dominator, platinum, '8gb', ddr4).
    motherboard(asus_prime_z270m-plus, asus, prime_z270m-plus, z270, lga1151, 4, ddr4).
    

    现在只需在两个地方使用相同的变量即可完成“连接”:

    ?- processor(Processor, _, _, _, _, Socket_type, RAM_type, _, _),
       component_ram(RAM, _, _, _, _, RAM_type),
       motherboard(Motherboard, _, _, _, Socket_type, _, RAM_type).
    

    这会产生 3 路连接。并且你可以使用更多的变量从你获得的三个记录中获取更多的信息:

    Processor = pentium_g4400,
    Socket_type = lga1151,
    RAM_type = ddr4,
    RAM = corsair_dominator_platinum_8gb_ddr4,
    Motherboard = asus_prime_z270m-plus.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      相关资源
      最近更新 更多