2017-02-14 50 views
1

我已經得到了以下事實成立:序言:說法是正確的IFF它是所有結果

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(應用程序)的布爾標誌: - ...

編輯2:爲清楚起見重組問題。

+1

能否請您包括一個運行示例查詢實現它?準確顯示您得到的結果,並準確描述您所期望的結果。當你說,* ...這對第一個陳述返回真,... *你指的是什麼「陳述」? – lurker

+0

當然可以。因此,當運行query_policyDataUseIsFair(App)/ 1時,它將針對targetedAds返回true,因爲它應該如此,並且下一個結果對於sendJunkMail將爲false。我想要的是它爲兩者(以及更多,如果稍後添加更多條目)做爲批處理進行評估,並且如果評估的所有結果均爲真,則輸出爲單個真;如果甚至是單一結果是錯誤的。希望清除它!謝謝。 –

回答

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不大;如果你的序言並沒有提供它(我的gprolog),可以按如下方式

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

謝謝,這正是我要去的!爲了檢查我對此的理解,我們使用findall(X,statement(_,X),List)組成查詢,它將創建所有結果的列表,然後遍歷列表的結果,已經寫了。那是對的嗎? –

+1

@ R.Sama - 正確。與此同時,我稍微改變了我的答案:我已經把'fact_appStatesHowDataIsUsed/2'的檢查放在了第一位。也許我錯了,但我認爲它更有效率,因爲如果檢查「行爲」失敗,你可以避免檢查所有的「Dup」。 – max66

+0

謝謝!你可能就在那裏,我看到它背後的邏輯。好喊。 –

相關問題