X
и Y
являются последовательными элементами некоторого List
, если List
имеет следующую форму: некоторый список Prefix
, затем X
, затем Y
, затем некоторый список Rest
.
Это то, что вы пытались express, но вы запутались в некоторых деталях. Сначала одноэлементный список , содержащий X
, записывается как [X]
. Вероятно, это то, что вы пытались сказать с помощью length(X, 1)
, но это не сработало бы так, как написано.
Во-вторых, вы запутались в использовании append/3
. То, как вы пытаетесь его использовать, последний аргумент - это весь список, который вы пытаетесь разложить. Таким образом, в этом сценарии третьим аргументом всегда должен быть список, который уже известен - либо потому, что он передан в качестве аргумента, либо потому, что он был вычислен по более ранней цели. В вашем коде первая append/3
цель - append(_, X, Part)
, где оба _
и Part
неизвестны. В этих обстоятельствах существует бесконечное количество решений, которые вызывают неопределенность, которую вы видите:
?- append(_, X, Part).
X = Part ;
Part = [_G2897|X] ;
Part = [_G2897, _G2903|X] ;
Part = [_G2897, _G2903, _G2909|X] ;
Part = [_G2897, _G2903, _G2909, _G2915|X] ;
Part = [_G2897, _G2903, _G2909, _G2915, _G2921|X] .
Короче говоря, у вас правильная идея, но порядок связывания вещей не совсем верен. Следующие работы:
?- List = [1, 2, 3], append(Prefix, Part1, List), append([X], Part2, Part1), append([Y], Rest, Part2).
List = Part1, Part1 = [1, 2, 3],
Prefix = [],
X = 1,
Part2 = [2, 3],
Y = 2,
Rest = [3] ;
List = [1, 2, 3],
Prefix = [1],
Part1 = [2, 3],
X = 2,
Part2 = [3],
Y = 3,
Rest = [] ;
false.
Сначала разбивает известный список List
= [1, 2, 3]
на части, которых только конечное число. Это связывает Part1
с конечным списком. Затем он разбивает конечный список Part1
, связывая Part2
с конечным списком, и, наконец, разделяет его. Нет места для нетерминирования, если начальный List
является конечным списком.
Все это говорит о том, что существует более простой способ выражения "некоторого списка, чем два смежных элемента X
и Y
, тогда какой-то другой список ":
?- append(_Prefix, [X, Y | _Rest], [1, 2, 3]).
_Prefix = [],
X = 1,
Y = 2,
_Rest = [3] ;
_Prefix = [1],
X = 2,
Y = 3,
_Rest = [] ;
false.