2017-10-17 60 views
2

例如,如果我想獲得總和爲10的所有可能的自然數對,我將如何得到prolog來做到這一點? 如果我的代碼是這樣的:在Prolog程序中查找所有自然數解決方案

sumsTo10(X,Y):- 
    Z is X+Y, 
    Z == 10. 

然後是的,如果我問,如果5,5和10,我得到一個真正的答案,但我想是這樣的:

?-sumsTo10(A,B). 
[1,9] 
[2,8] 
.... 

回答

3

可以使用ç 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. 

第一行指定,這兩個XY處於1..10域(即10以下,但是這並不重要)。第二行是限制:它限制了X + Y應該等於(#=)至10的事實。這將約束:它不會地面XY到這個實際持有的價值觀,但是從目前XY被(部分)接地,並且約束不能滿足,就會失敗。如果您例如將X設置爲10,則將導出Y只能爲0,但由於Y位於區間1..10中,所以這是不可能的,因此係統將會失敗。

最後,通過使用label([X,Y]),我們將在域中指定值爲XY,以使約束成立。

2

您的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 
... 
相關問題