我正在建立一个专家系统,他应该能够在向用户询问一些问题之后组装一台计算机,以了解他的需求!我的问题是选择最好的处理器,最好的内存,最好的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)
答案 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.
您还可以使用约束来获得更大的灵活性(例如,在价格范围内轻松列出程序集)。