如何在 Prolog 中为一个变量(如字符串)分配多个值?
How can I assign multiple values to a variable (like a string) in Prolog?
今天早些时候,我寻求帮助在 prolog 中构建数据库以及如何按参数进行搜索,有人想到了这个:
You can also add a list of terms to every processor, like:
processor(pentium_g4400, [brand('intel'), family('pentium'),
series('g4400'), clock(3.3),
socket('lga1151'), ram('ddr4'),
cores(2), threads(2)]).
In that case you can query with:
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)).
(或输入我想搜索的任何其他参数)
它回答了我一个与参数匹配的组件列表(这是我正在寻找的结果)。
但是,如果我尝试使用 "member" 来设置多个参数,就像这样:
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
查看您的数据库文件,我认为您今天早些时候得到的建议不是正确的方向。我可能会把它当作一个直接的关系数据库来处理,table 像这样:
% 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).
现在 "join" 只需在两个地方使用相同的变量即可完成:
?- 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.
今天早些时候,我寻求帮助在 prolog 中构建数据库以及如何按参数进行搜索,有人想到了这个:
You can also add a list of terms to every processor, like:
processor(pentium_g4400, [brand('intel'), family('pentium'),
series('g4400'), clock(3.3),
socket('lga1151'), ram('ddr4'),
cores(2), threads(2)]).
In that case you can query with:
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)).
(或输入我想搜索的任何其他参数) 它回答了我一个与参数匹配的组件列表(这是我正在寻找的结果)。 但是,如果我尝试使用 "member" 来设置多个参数,就像这样:
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
查看您的数据库文件,我认为您今天早些时候得到的建议不是正确的方向。我可能会把它当作一个直接的关系数据库来处理,table 像这样:
% 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).
现在 "join" 只需在两个地方使用相同的变量即可完成:
?- 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.