我有以下事实:
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:为了清晰起见,重组了问题。
答案 0 :(得分:1)
不确定你想要什么,但我想你需要findall/3
和forall/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)).