例如,如果我想獲得總和爲10的所有可能的自然數對,我將如何得到prolog來做到這一點? 如果我的代碼是這樣的:在Prolog程序中查找所有自然數解決方案
sumsTo10(X,Y):-
Z is X+Y,
Z == 10.
然後是的,如果我問,如果5,5和10,我得到一個真正的答案,但我想是這樣的:
?-sumsTo10(A,B).
[1,9]
[2,8]
....
例如,如果我想獲得總和爲10的所有可能的自然數對,我將如何得到prolog來做到這一點? 如果我的代碼是這樣的:在Prolog程序中查找所有自然數解決方案
sumsTo10(X,Y):-
Z is X+Y,
Z == 10.
然後是的,如果我問,如果5,5和10,我得到一個真正的答案,但我想是這樣的:
?-sumsTo10(A,B).
[1,9]
[2,8]
....
可以使用ç onstraint 大號邏輯P在AGC庫在˚F inite d omains(clpfd
),選擇那些:
:- use_module(library(clpfd)).
sumsTo10(X,Y):-
[X,Y] ins 1..10,
X + Y #= 10,
label([X,Y]).
這然後產生:
?- sumsTo10(X,Y).
X = 1,
Y = 9 ;
X = 2,
Y = 8 ;
X = 3,
Y = 7 ;
X = 4,
Y = 6 ;
X = Y, Y = 5 ;
X = 6,
Y = 4 ;
X = 7,
Y = 3 ;
X = 8,
Y = 2 ;
X = 9,
Y = 1.
第一行指定,這兩個X
和Y
處於1..10
域(即10以下,但是這並不重要)。第二行是限制:它限制了X + Y
應該等於(#=
)至10
的事實。這僅將約束:它不會地面X
和Y
到這個實際持有的價值觀,但是從目前X
和Y
被(部分)接地,並且約束不能滿足,就會失敗。如果您例如將X
設置爲10
,則將導出Y
只能爲0
,但由於Y
位於區間1..10
中,所以這是不可能的,因此係統將會失敗。
最後,通過使用label([X,Y])
,我們將在域中指定值爲X
和Y
,以使約束成立。
您的Prolog可以提供between/3。然後
?- between(1,10,X), between(1,10,Y), X+Y =:= 10.
X = 1,
Y = 9 ;
X = 2,
Y = 8 ;
X = 3,
Y = 7
...