嘿伙计们,我是新手,我自己学习。 我在网上发现了这个问题,但没有任何答案。
我有这个数据库
countries([belgium, france, germany, italy, luxembourg, netherlands]).
weight(france, 4).
weight(germany, 4).
weight(italy, 4).
weight(belgium, 2).
weight(netherlands, 2).
weight(luxembourg, 1).
threshold(12).
现在我制定了这个程序,看看国家名单是否有足够的票数来超过门槛。
winning([], 0).
winning([Head | Tail], N):-
weight(Head, N1),
winning(Tail, N2),
N is N1 + N2.
winning(Y):-
winning(Y, N),
threshold(X),
N >= X.
现在我需要写一个关键程序/ 2,第一个参数是一个国家,第二个参数是一个国家列表。是否需要第一个超过门槛的国家。
示例:
?- critical(netherlands, [belgium, france, germany]).
True
?- critical(netherlands, [france, germany, italy]).
False
对于这个程序我需要先检查,如果第二个参数已经获胜。如果是这样,它就会失败。如果不是我需要获取第一个参数的值,将其添加到第二个值,然后检查它是否超过阈值。如果它不够,它将失败。如果它足够就会成功。
critical(X,Y):-
winning(Y,N),
weight(X,Value),
N1 is N+Value,
threshold(X),
N1 >= X.
我在这里做了很多错事,但我不知道如何解决它。
答案 0 :(得分:3)
你非常接近解决方案。一些提示:
首先,一个好的命名约定可以帮助您跟踪哪个参数是什么:
critical(C, Cs) :-
这清楚地表明第一个参数是一个国家,第二个参数是零个或多个国家的列表。
所以,让我们先将Cs
与他们的总重量联系起来。同样,它有助于获得良好的命名约定,明确哪个参数是什么:
country_weight(france, 4).
country_weight(germany, 4).
country_weight(italy, 4).
country_weight(belgium, 2).
country_weight(netherlands, 2).
country_weight(luxembourg, 1)
现在,为了将多个国家/地区与各自的权重相关联,我们使用元谓词maplist/3
:
maplist(country_weight, Cs, Ws)
并对权重求和,我们使用sum_list/2
:
sum_list(Ws, Sum)
很明显如何描述Sum
必须低于阈值(作为练习留下)。
最后,为了表示总和加上第一个参数表示的国家的权重大于阈值,我们使用:
country_weight(C, W),
W + Sum > Threshold
这样就完成了定义。请注意,没有必要描述哪些国家存在。因此,您可以省略程序的第一个谓词。