Prolog:陈述是真的IFF所有结果都是如此

时间:2017-02-14 22:37:23

标签: prolog

我有以下事实:

fact_dataIsUsedFor(searchQueries, targetedAds).
fact_dataIsUsedFor(searchQueries, sendJunkMail).

fact_dataUsageIsUnfair(sendJunkMail).
fact_dataUsageIsFair(targetedAds).

fact_appStatesHowDataIsUsed(app, true).

我在这里有一个问题:

query_policyDataUseIsFair(App):-
    fact_dataIsUsedFor(_, DataUsePurpose),
    fact_dataUsageIsFair(DataUsePurpose),
    \+ fact_dataUsageIsUnfair(DataUsePurpose),
    fact_appStatesHowDataIsUsed(App, true).

我要做的是实现逻辑,如果上述查询的所有答案都返回true,则该语句为true,否则一个false将使该语句返回false。

目前,对于targetedAds,返回true,对sendJunkMail返回false。

在评估所有结果后,我怎样才能让它只返回1个真/假的答案?

谢谢!

编辑:已实现我在query_policyDataUseIsFair(App)上不需要布尔标志: - ...

编辑2:为了清晰起见,重组了问题。

1 个答案:

答案 0 :(得分:1)

不确定你想要什么,但我想你需要findall/3forall/2

这样的东西
query_policyDataUseIsFair(App):-
    fact_appStatesHowDataIsUsed(App, true),
    findall(Dup, fact_dataIsUsedFor(_, Dup), List),
    forall(member(Elem, List), (fact_dataUsageIsFair(Elem),
                                \+ fact_dataUsageIsUnfair(Elem))).

findall/3是ISO Prolog但forall/2不是;如果你的Prolog没有提供它(作为我的gprolog),你可以按如下方式实现它

forall(Cond, Act) :-
    \+ (call(Cond), \+ call(Act)).