Я написал следующий предикат:
list_withoutlast([_Last], []). % forget the last element
list_withoutlast([First, Second|List], [First|WithoutLast]) :-
list_withoutlast([Second|List], WithoutLast).
Запросы типа list_withoutlast(X, [1, 2]).
успешны детерминистически, но запросы типа list_withoutlast([1, 2, 3], X)
оставляют после себя точку выбора, даже если есть только один ответ.
Когда я отслеживаю, кажется, что SWI пытается сопоставить list_withoutlast([3], Var)
с обоими предложениями, хотя определенно только первое из них будет когда-либо совпадать!
Есть ли что-то еще, что я могу сделать, чтобы сообщить SWI, что мне нужен список с более чем одним элементом? Или, если я хочу воспользоваться индексацией по первому аргументу, есть ли у меня единственные варианты «список нулевой длины» и «список ненулевой длины»?
Обрабатывают ли другие Прологи эту ситуацию по-другому?
Prolog
, мы сообщаем другим, что та же проблема и решения применимы к другим реализациям Prolog. - person Paulo Moura   schedule 11.07.2018