首页 > 解决方案 > 检查一个国家/地区是否达到阈值

问题描述

大家好,我是 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).

我制作了这个程序来查看一个国家列表是否有足够的票数超过阈值,我想使用谓词 win/1

winning([H|T]):-
 weight(H, N1),
 winning(T),
 weight(T, N2),
 N is N1 + N2,
 N>=X,
 threshold(X).

该程序完美运行,直到它必须将投票权相加并得出投票是否达到阈值为止。

这很困难,因为我只想使用谓词 win/1 有人可以帮助我吗?

标签: prolog

解决方案


它没有将 N1 和 N2 加到 N 中的原因是因为您要询问整个尾巴的重量数,而您应该只获得尾巴头部的重量。在这一点上你还没有。

您想创建一个单独的(递归)规则,wining/2 并从 wins/1 中调用它:

winning(Countries) :-
winning2(Countries,0).

在这个单独的 wins/2 中,您调用存储在 N 中的权重,并递归地回调 wins/2 直到 N 达到阈值。

winning2([],N) :-
    threshold(X),
    N >= X.

winning2([Country|Tail], N) :-
        weight(Country,X),
        NewN is X + N,
        winning2(Tail, NewN).

推荐阅读