2012-03-11 41 views
1

我試圖實現謂詞,它將在所有變量未被替換的模式下工作 sum(X,Y,Z)將生成所有填充該條件的數字X + Y = Z 。 其實我可以用這種方式生成下一個數字的列表。如何實現序言中的sumator

lisst([_]). 
lisst([_|Y]) :- lisst(Y). 
fill([]). 
fill([0|Xs]) :- fill(Xs). 
fill([1|Xs]) :- fill(Xs). 
fill([2|Xs]) :- fill(Xs). 
fill([3|Xs]) :- fill(Xs). 
fill([4|Xs]) :- fill(Xs). 
fill([5|Xs]) :- fill(Xs). 
fill([6|Xs]) :- fill(Xs). 
fill([7|Xs]) :- fill(Xs). 
fill([8|Xs]) :- fill(Xs). 
fill([9|Xs]) :- fill(Xs). 



concat_number(D,N) :- concat_number(D,N,0). 
concat_number([],M,M). 
concat_number([H|T],N,M) :- M1 is M*10+H, concat_number(T,N,M1). 

    sum2(X,Y,Z) :-lisst(X),fill(X),lisst(Y),fill(Y),concat_number(X,X1), concat_number(Y,Y1), Z is X1 + Y1. 

和我問的序言是? - sum2(X,Y,Z)。但是隻有Y號碼正在改變,它不能很好地工作。

+0

我無法重現錯誤(在SWI-Prolog上)。順便說一句,列舉有限列表的習慣方式是「長度(L,_)」。 – 2012-03-11 17:13:30

+0

未定義的過程:'concat_number'。另外,'X'是該定義中的單例變量。 – 2012-03-11 17:18:12

+0

請編輯您的原始問題;評論對於很長一段代碼來說並不好。此外,請重新考慮您的問題,並嘗試使用[SSCCE](http://sscce.org/)。 – 2012-03-11 17:25:25

回答

3

您遇到的行爲是由於Prolog的深度優先搜索控制算法:由於Y具有無限數量的值,因此Prolog從不會超出其選擇點。您應該實施iterative deepening search算法,如

length(XY, _),  % backtrack over lists in order of length 
X=[_|_],    % constrain X and Y to be non-empty 
Y=[_|_], 
append(X, Y, XY), % break XY into X and Y 
fill(XY),   % fill X and Y in one go 
concat_number(X,I), 
concat_number(Y,J), 
Z is I+J. 
+0

任何版本沒有追加append生成垃圾 – whd 2012-03-11 20:38:43

+0

嗯,以及如何不生成許多相同的答案像[0,4],[0,0.4]好吧我刪除填充(0 | Xs)填寫 – whd 2012-03-11 20:49:29

+0

@ user1262568:通過生成列表並將它們轉換爲數字來執行此操作會導致許多重複項。你最好直接用諸如int(0)的謂詞來生成整數。 int(N): - int(M),N是M + 1.' – 2012-03-11 20:57:25