2012-03-08 3 views
0

Рассмотрим следующий список состояний: [Sin, S2, S3, ..., Sout]с помощью пролог генерировать предложения

и следующие правила:

  1. , то можно вернуться от S (п) до S (N-1), если есть такие S (N-1)

  2. это не возможно, чтобы вернуться из S (уходит)

  3. себе ntence всегда начинается с S (в) и заканчивается S (из)

Я хотел бы иметь правило, которое может быть активирована как это:

?- sentence(X, backs) 

, в котором «спины» означает, как много раз «назад» разрешено.

Для этого списка [а, б, в, г]

?- 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, что список имеет только два элемента или бесконечный в противном случае. Например. если он имеет 3 элемента (a, b, c), вы можете сформировать (a, b, c), (a, b, a, b, c), (a, b, a, b, a, ..., в) где ... любое число (b, a) подпоследовательностей. – gusbro

+0

В запросе ожидается ограничение. С параметром «backs» я рассчитываю контролировать, сколько раз вернуться назад. Это сделает его конечным. –

+0

, так что вы нашли какие-либо ответы здесь полезными вообще, достойными повышения и принятия? –

ответ

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

Спасибо. Я попробую это как можно скорее. –

+0

@AdrianHerscu из вашего описания неясно, разрешено ли перемещение с 'S2' на' Sin'. И мой код, и ваш пример работают так, как будто это разрешено. Если нет, просто 'go ([A | B], N, [A | B2]): - предложение (B, N, B2) .' –

Смежные вопросы