检查是否需要一个国家进行关键的投票

时间:2015-09-21 14:00:23

标签: prolog

嘿伙计们,我是新手,我自己学习。 我在网上发现了这个问题,但没有任何答案。

我有这个数据库

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.

我在这里做了很多错事,但我不知道如何解决它。

1 个答案:

答案 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

这样就完成了定义。请注意,没有必要描述哪些国家存在。因此,您可以省略程序的第一个谓词。