2012-03-08 43 views
0

考慮國家名單如下: [仙,S2,S3,...,SOUT]使用序言產生句子

及以下規則:

  1. 就可以回去從S(n)與S(N-1)如果有這樣 S(N-1)

  2. ,不可能從S(下)

  3. 一個本身回去ntence總是以S開頭(中)與S(出)結束

我想有可能這樣被激活的規則:

?- sentence(X, backs) 

其中「背影」是指如何許多時候允許「返回」。

對於這個列表[A,B,C,d]

?- sentence(x, 2) 

會產生:

[a,b,c,d] %no backs 
[a,b,a,b,c,d] %one back 
[a,b,c,b,c,d] %from d we cannot go back 
[a,b,a,b,c,b,c,d] %two backs 
[a,b,c,b,a,b,c,d] %two backs 
+0

您的問題,如目前所述,將返回1它列表只有兩個項目或無限其他。例如。 (a,b,c),(a,b,a,b,c),(a,b,a,b,a,..., c)其中...是任意數量的(b,a)子序列。 – gusbro 2012-03-09 12:57:05

+0

查詢中存在預期的約束。有了「backs」參數,我希望控制返回的次數。這將使其有限。 – 2012-03-09 18:28:57

+0

所以你有沒有發現這裏的答案有幫助,值得讚揚和接受? – 2012-03-16 09:48:28

回答

0

這裏的東西,這似乎是工作:

sentence([A|B], N, [A|X]) :- B=[_|_] -> sentence(B,[A],N,X) 
             ; B = X. 
sentence(B, _, 0, B).     % no more moves back left 
sentence([B,C], _, N, [B,C]):- N>0. % no going back from end node 
sentence([B|C], A, N, [B|X]):- N>0, C=[_|_],    
           sentence(C, [B|A], N, X).  $ fore 
sentence([B|C], [A|D], N, [B|X]):- N>0, C=[_|_], N1 is N-1, 
           sentence([A,B|C], D, N1, X). $ aft 

運行它給我

23 ?- sentence([a,b,c,d],2,X). 
X = [a, b, c, d] ; 
X = [a, b, c, b, c, d] ; 
X = [a, b, c, b, c, b, c, d] ; 
X = [a, b, c, b, a, b, c, d] ; 
X = [a, b, a, b, c, d] ; 
X = [a, b, a, b, c, b, c, d] ; 
X = [a, b, a, b, a, b, c, d] ; 
No 
+0

謝謝。我會盡快嘗試。 – 2012-03-12 18:58:09

+0

@AdrianHerscu從你的描述中不清楚是否允許從'S2'回到'Sin'。我的代碼和你的例子都是在允許的情況下運行的。如果不是,只要做'go([A | B],N,[A | B2]): - 句子(B,N,B2).' – 2012-03-12 21:24:23