2012-03-08 29 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