Я пытаюсь написать программу для пролога, которая ведет себя следующим образом:
он перечисляет все возможные последовательные (я не уверен, что это правильная фраза, то есть [a, c] не является подсписком [a, b, c]), подсписки, длина подсписка, расстояние от первого элемент соответствующего списка до первого элемента подсписка и расстояние от последнего элемента подсписка до последнего элемента правильного списка.
Поэтому в идеале ввод / вывод должен выглядеть примерно так:
| ?- sublist([a,b], SubList, Before, Len, After).
SubList= [], After = 2, Before = 0, Len = 0 ? ;
SubList= [a], After = 1, Before = 0, Len = 1 ? ;
SubList= [a,b], After = 0, Before = 0, Len = 2 ? ;
SubList= [], After = 1, Before = 1, Len = 0 ? ;
SubList= [b], After = 0, Before = 1, Len = 1 ? ;
SubList= [], After = 0, Before = 2, Len = 0 ? ;
Пока что я могу правильно вывести подсписки и вывести их длины, вот так:
sublist(L,S,Len) :-
append(_,L2,L), %getting sublist
append(S,_,L2), %getting sublist
length(S,Len). %getting length of sublist
но мне трудно понять, как я могу отслеживать «До» и «После».
Казалось, что (возможно, подлый?) Способ сделать это - начать B с -1 и увеличивать «До» на 1 каждый раз, когда встречается [] -значный подсписок (поскольку встреча с [] означает, что голова была удалены, и теперь мы начинаем заново только с хвоста), и когда у вас есть «До», «После» будет просто ([длина списка ввода] - «До» - [длина подсписка]) , К сожалению, я в полной растерянности относительно того, как мне пойти на увеличение «До».
Какие-нибудь мысли? Спасибо! :)