我正在构建一个专家系统,在向用户询问一些问题以了解他的需求之后应该能够组装一台计算机!我的问题是选择最好的处理器,最好的RAM,最好的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.
Run Code Online (Sandbox Code Playgroud)
我不是要求你为我这样做,我只是提出一些建议来做到这一点,我可能不得不为每个组件添加一些元素,也许还有一些关系,但我现在陷入了僵局.
编辑:
我已经定义了配置谓词,但是通过这种方式我可以使用forall
/ 来定义所有可能的配置findall
,但是我需要生成最好的配置,所以我可能需要为每个组件定义一个选择谓词.
你谈到了一个分数,我可以为每个组件设置一个分数,这意味着组件如何适合用户.
我在组件之间添加了一些关系,我应该在定义配置时使用它们.关于这些关系,我不确定是否必须像其他组件一样存储它们,或者我必须断言它们,例如通过检查bot组件是否具有相同的套接字.
compatibility(motherboard, processor)
compatibility(motherboard, ram)
compatibility(motherboard, vga)
compatibility(processor, ram)
Run Code Online (Sandbox Code Playgroud)
鉴于您描述的是由多个组件组成的对象,一种有趣的方法是使用DCG来表示组件的组成.例如:
computer --> monitor, keyboard, mouse, motherboard.
motherboard --> [motherboard], memory, processor.
memory --> [memory].
processor --> [processor].
monitor --> [monitor].
keyboard --> [keyboard].
mouse --> [mouse].
...
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用phrase/2
谓词来获取构建内容所需的部件列表.例如:
| ?- phrase(computer, Parts).
Parts = [monitor, keyboard, mouse, motherboard, memory, processor]
yes
Run Code Online (Sandbox Code Playgroud)
当然,您可以通过添加更多语法规则轻松地拥有不同的替代方案(即构建不同的计算机).例如,带有独立显卡的高级主板与带有集成显卡的基本主板.
在获得所描述的基本整体/部件之后,您可以通过增加语法规则来开始添加诸如价格之类的特征.例如:
computer(Price) -->
monitor(MonitorPrice),
keyboard(KeyboardPrice),
mouse(MousePrice),
motherboard(MotherboardPrice),
Price is MonitorPrice + KeyboardPrice + MousePrice + MotherboardPrice.
Run Code Online (Sandbox Code Playgroud)
您还可以使用约束来获得更大的灵活性(例如,在价格范围内轻松列出装配).