回答
你可以使用庫(aggregate)計算解決方案
:- use_module(library(aggregate)).
% it's useful to declare this for modularization
:- meta_predicate at_least(0, +).
at_least(Predicate, Minimum) :-
aggregate_all(count, Predicate, N),
N >= Minimum.
例如:
?- at_least(member(_,[1,2,3]),3).
true.
?- at_least(member(_,[1,2,3]),4).
false.
編輯這裏是一個更有效的方式,使用SWI-Prolog的設施global variables
at_least(P, N) :-
nb_setval(at_least, 0),
P,
nb_getval(at_least, C),
S is C + 1,
(S >= N, ! ; nb_setval(at_least, S), fail).
用這個定義,P叫做只是 N次。 (筆者爲大家介紹服務謂詞M/2,顯示它返回什麼)
m(X, L) :- member(X, L), writeln(x:X).
?- at_least(m(X,[1,2,3]),2).
x:1
x:2
X = 2.
編輯佔@false評論,我想
?- call_nth(m(X,[1,2,3]),2).
x:1
x:2
X = 2 ;
x:3
false.
與call_nth從here。
從實際角度來看,我認爲nb_setval(vs nb_setarg)遭受了全局和局部變量之間的通常折衷。即對於某些任務可能會很輕易地知道接受條件的限制。如果這不是必需的,nb_setarg它更乾淨。
底線:更好的方法是使用call_nth,雙重否定解決不當變量實例化的'技巧'。
您對全局變量的使用不正確。你在查詢中產生意外的替換('X = 2')。 – false
我該如何計算結果,然後爲什麼時候設置最小值?
目前尚不清楚你的結果是什麼意思。所以我會做一些猜測。結果可能是:
解決方案。例如,目標member(X,[1,2,1])
有兩個解決方案。不是三個。在這種情況下,請考慮使用setof/3
或類似的謂詞。無論如何,在解決您遇到的問題之前,您應該首先了解setof/3
。
答案。目標member(X,[1,2,1])
有三個答案。目標member(X,[Y,Z])
有兩個答案,但無限多的解決方案。
所以,如果你想確保至少有答案一定數目,定義:
at_least(Goal, N) :- \+ \+ call_nth(Goal, N).
與call_nth/2
defined in another SO-answer。
請注意,其他SO答案不正確:它們要麼不終止,要麼產生意外的實例化。
- 1. 功能不返回多個結果
- 2. SQL,連接兩個或多個表,並返回結果
- 3. 返回多個json結果
- 4. nlapiSearchRecord返回多個結果
- 5. ASP.NET - 返回多個結果
- 6. 如何判斷多個getView結果中的哪一個可見?
- 7. SQL - 如果結果集包含多個行,則返回最新(id)結果
- 8. SQLAlchemy:如果連接返回多個結果,則只顯示最新結果
- 9. 序言或(;)規則返回多個結果
- 10. 如果爲空,則返回多個值
- 11. 如何從ajax成功返回結果?
- 12. 如何返回多個結果集?
- 13. 如何返回多個JSON結果
- 14. 如何判斷LinqToSql DataContext以前是否返回結果
- 15. 如何判斷沒有返回值的函數的結果?
- 16. 從多個結果集中返回單個結果集
- 17. 返回兩個查詢的結果
- 18. 使用JPA返回兩個結果集
- 19. StoredProcItemReader-過程返回兩個結果集
- 20. XPath查詢應該返回多個結果,但只返回一個結果
- 21. AJAX成功返回老的結果
- 22. 如果我的HTML是這個Java正則表達式返回單個結果或多個
- 23. MySQL返回行如果插入成功,否則返回'失敗'
- 24. 如果你想要形成功能,哪個更好?返回或者返回false
- 25. 使用函數返回多個結果
- 26. MySQL子查詢返回多個結果
- 27. 返回從一行多個結果
- 28. SSIS任務返回多個結果
- 29. 返回多個sql查詢結果 - C#
- 30. 從方法中返回多個結果
應該很容易使用[findall/3]進行編碼(http://stackoverflow.com/questions/1468150/how-do-i-find-all-solutions-to-a-goal-in-prolog)。 – ShiDoiSi