用prolog生成句子
考虑下列国家名单: [Sin,S2,S3,…,Sout] 以及以下规则:用prolog生成句子,prolog,Prolog,考虑下列国家名单: [Sin,S2,S3,…,Sout] 以及以下规则: 如果存在这样的情况,可以从S(n)返回到S(n-1) S(n-1) 无法从S(out)返回 句子总是以S(in)开头,以S(out)结尾 我希望有一个规则可以像这样激活: ?- sentence(X, backs) 其中“backs”表示允许“back”的次数 对于此列表[a、b、c、d] ?- sentence(x, 2) 将产生: [a,b,c,d] %no backs [a,b,a,b,c,d] %one b
?- sentence(X, backs)
其中“backs”表示允许“back”的次数
对于此列表[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
以下是一些似乎有效的方法:
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
您的问题,如当前所述,将返回1,如果列表只有两个项目,否则返回无限。例如,如果它有3个元素(a,b,c),你可以形成(a,b,c),(a,b,a,b,c),(a,b,a,…,c),其中。。。是任意数量的(b,a)子序列。查询中应有约束。使用“backs”参数,我希望控制返回的次数。这会使它变得有限。那么你觉得这里的任何答案都有帮助吗,值得投票和接受吗?@AdrianHerscu从你的描述来看,不清楚是否允许从
S2
移回Sin
。我的代码和您的示例都像是被允许的一样运行。如果没有,只需做go([A | B],N[A | B2]):-句子(B,N,B2)。