2009-12-24 155 views
4

如何定義a作爲整數/浮點數?Prolog的算術語法

我想查找a+b+c+d=10的結果,其中a,b,c,d是整數,而>=0

+0

添加了一個解決方案,我的答案。 – kingchris 2009-12-24 18:47:59

回答

4

下面是一個簡單的,現代的,純粹的Prolog,非CLP-庫解決方案:

range(X):- 
     member(X,[0,1,2,3,4,5,6,7,8,9,10]). 

ten(A,B,C,D):- 
     range(A), 
     range(B), 
     range(C), 
     range(D), 
     10 =:= A + B + C + D. 
+0

有代表0〜10更簡單的方法呢?我很擔心,當問題的域名是0〜100 ... – user198729 2009-12-26 12:43:27

+0

SWI Prolog有''謂詞/間3''。 (0,100,X)之間的''將連續地將X綁定到0..100。 – ThomasH 2009-12-26 16:32:05

+0

**/gnu-prolog **之間的'/ 3'可以在[GNU Prolog兼容層](http://www.david-reitter.com/compling/prolog/compat_gnu.pl)中找到,順便說一下。相關計算器問題:Prolog的兼容層 - 提供編程庫(http://stackoverflow.com/questions/7151675/prolog-compatibility-layers-available-programming-libraries) – 2011-08-22 18:44:12

5

與SWI-Prolog的,你可以使用CLP(FD)庫

1 ?- use_module(library(clpfd)). 
% library(error) compiled into error 0.00 sec, 9,764 bytes 
% library(clpfd) compiled into clpfd 0.05 sec, 227,496 bytes 
true. 

2 ?- Vars=[A,B,C,D],Vars ins 0..10,sum(Vars,#=,10),label(Vars). 
Vars = [0, 0, 0, 10], 
A = 0, 
B = 0, 
C = 0, 
D = 10 ; 
Vars = [0, 0, 1, 9], 
A = 0, 
B = 0, 
C = 1, 
D = 9 ; 
Vars = [0, 0, 2, 8], 
A = 0, 
B = 0, 
C = 2, 
D = 8 ; 
Vars = [0, 0, 3, 7], 
A = 0, 
B = 0, 
C = 3, 
D = 7 ; 
... 
+0

你能解釋一下代碼嗎? – user198729 2009-12-24 13:18:14

+0

好,必須首先定義4個變量,然後定義變量域(從0..10),然後添加約束(所有瓦爾的總和= 10),最後的陳述(標籤商(VAR)),導致在對所有可能的搜索(通過回溯)變量值。 – Xonix 2009-12-24 17:14:41

+0

是否,#= clp的關鍵字?我以前從未在序言中看到它們。 – user198729 2009-12-25 03:10:13

2

這裏是GNU-Prolog一段代碼約束解決有限域:

$ gprolog 
| ?- [user]. 
compiling user for byte code... 
ten(A,B,C,D) :- fd_domain([A,B,C,D],0,9999999), 10 #= A + B + C + D. 

Ctrl + d

| ?- ten(A,B,C,D), fd_labeling([A,B,C,D]). 

正如你所看到的,它解決了大範圍像0-9999999

A = 0 
B = 0 
C = 0 
D = 10 ? ; 

A = 0 
B = 0 
C = 1 
D = 9 ? ; 

A = 0 
B = 0 
C = 2 
D = 8 ? ; 
... 

附:問題感謝PrzemysławKobylański爲他的blog with clear, very nice Prolog examples,我找到了鼓舞人心的例子。

P.P.S.在玩有限域名時,您可能會喜歡使用fd_set_vector_max/1。在上述情況下,它是沒有必要的,但取決於約束可能是有用的 - 當GNU的Prolog的範圍上運行的詳細信息,當可能值的向量,can be found at manual "Finite domain solver and built-in predicates - Introduction"