选择最佳组件的最佳方式是什么?

时间:2018-06-05 21:59:25

标签: prolog dcg

我正在建立一个专家系统,他应该能够在向用户询问一些问题之后组装一台计算机,以了解他的需求!我的问题是选择最好的处理器,最好的内存,最好的VGA ecc ecc,只向用户显示一个配置!
组件存储如下:

configuration(P, M, R, C, A, V, S, D, H, Dvd, Price_range) :-
processor(P, Proc_price, Price_range),
motherboard(M, Motherboard_price, Price_range),
ram(R, Ram_price, Price_range),
case(C, Case_price, Price_range),
ali(A, Ali_price, Price_range),
video_card(V, Vga_price, Price_range),
ssd(S, Ssd_price, Price_range),
monitor(D, Monitor_price, Price_range),
dvd(Dvd, Dvd_price, Price_range),
hdd(H, Hdd_price, Price_range).
Price is Proc_price + Motherboard_price + Ram_price + Case_price + Ali_price + Vga_price + Ssd_price + Dvd_price + Monitor_price + Hdd_price.

我不是要求你为我这样做,我只是想提出一些建议,我可能要为每个组件添加一些元素,也许还有一些关系,但我现在陷入僵局

编辑:

我已经定义了配置谓词,但是通过这种方式,我可以使用forall / findall来定义所有可能的配置,但是我需要生成最好的配置,所以也许我需要为每个组件定义一个选择谓词。

你谈到了一个分数,我可以为每个组件设置一个分数,这意味着该组件如何适合用户。

我在组件之间添加了一些关系,我应该在定义配置时使用它们。关于这些关系,我不确定是否必须像其他组件一样存储它们,或者我必须断言它们,例如通过检查bot组件是否具有相同的套接字。

compatibility(motherboard, processor)
compatibility(motherboard, ram) 
compatibility(motherboard, vga)
compatibility(processor, ram)

1 个答案:

答案 0 :(得分:6)

鉴于您描述的是由多个组件组成的对象,一种有趣的方法是使用DCG来表示组件的组成。例如:

computer --> monitor, keyboard, mouse, motherboard.

motherboard --> [motherboard], memory, processor.

memory --> [memory].
processor --> [processor].
monitor --> [monitor].
keyboard --> [keyboard].
mouse --> [mouse].
...

然后,您可以使用phrase/2谓词来获取构建内容所需的部件列表。例如:

| ?- phrase(computer, Parts).
Parts = [monitor, keyboard, mouse, motherboard, memory, processor]
yes

当然,您可以通过添加更多语法规则轻松拥有不同的替代方案(即构建不同的计算机)。例如。带有独立显卡的高级主板与带集成显卡的基本主板。

在获得所描述的基本整体/部件后,您可以通过增加语法规则来开始添加价格等特征。例如:

computer(Price) -->
    monitor(MonitorPrice),
    keyboard(KeyboardPrice),
    mouse(MousePrice),
    motherboard(MotherboardPrice),
    Price is MonitorPrice + KeyboardPrice + MousePrice + MotherboardPrice.

您还可以使用约束来获得更大的灵活性(例如,在价格范围内轻松列出程序集)。