如何在Prolog的知识库中添加所有数据?

时间:2013-05-23 18:03:58

标签: prolog declarative

我需要帮助这项Prolog练习:

% items
items (cell).
items (labial).
items (control).
items (mirror).

% Weight of each item
weight (cell 2).
weight (labial, 3).
weight (control, 5).
weight (mirror, 10).

capacity (X, Y, Z, V) :-
    weight (X C1), weight (Y, C2), weight (Z, C3), sum (C1, C2, C3, R), V> = R.

sum (X, Y, Z, K) :- K is X + Y + Z.

这个程序给我一个给定重量的3项或更少的组合,例如容量(X,Y,Z,15)。

结果是,X:细胞,Y:唇膏,Z:镜子,X:对照,Y:细胞,Z:镜子。连续使用所有组合,其中3个权重的总和没有更高的输入。

目前我受到手动收入变量数量的限制,容量(X,Y,Z,N ......)我想要的是关于物品数量的组合知识库,而不是手动输入变量。我怎么能这样做?

理想的容量(重量)和响应也是如此。

重量不超过的项目组合

手机,口红,镜子。 控制手机。 镜子,控制,labilal .......

抱歉,我不会说英语,我正在使用谷歌翻译。

1 个答案:

答案 0 :(得分:1)

看起来你正在寻找的结构是一个列表,你应该查找它([HD:TL],其中TL是一个列表)。我在下面提供的解决方案应该显示如何使用列表达到预期的效果,尽管我的解决方案允许重复,而不关心列表的顺序。如果这是用于家庭作业,一旦你对列表有所了解,你应该能够弄清楚如何自己解决这个问题。

基本上,第一个谓词处理制作长项目列表,HD是一个权重为X的项目,它寻找定义尾部(TL)列表的谓词;第二个处理列表的结尾(TL在前一个归纳步骤中是[])和空列表(因为即使空列表也需要爱)。

items(cell).
items(labial).
items(control).
items(mirror).
weight(cell,2).
weight(labial,3).
weight(control,5).
weight(mirror,10).
capacity(W, [HD|TL]) :- items(HD),weight(HD,X),W>0,capacity(W-X,TL). 
capacity(W, []) :- W>=0.