Обрезка неинициализированных значений списка в прологе - PullRequest
1 голос
/ 11 ноября 2011

Я пишу что-то на прологе и, как я использовал append, в конечном итоге возвращается список вроде [a, b, c | _].Есть ли какой-нибудь стандартный предикат (или простой способ) обрезать все неинициализированные / произвольные значения?

Изменить, чтобы добавить: Длина не будет работать, потому что список может быть произвольной длины, я не знаючто это будет раньше времени, иначе я бы уже использовал это, чтобы урезать его.

Ответы [ 4 ]

3 голосов
/ 11 ноября 2011

Вы должны проверить, почему append дает вам такой список.Потому что соблюдайте это поведение append, которое решает проблему, которую вы видите:

?- append([a,b,c|_], X, L).
L = [a,b,c|X]
?- append([a,b,c|_], X, L), X=[].
L = [a,b,c]
2 голосов
/ 11 ноября 2011

Если ваш список не заканчивается на [], вы почти наверняка создадите свой список неправильно.

2 голосов
/ 11 ноября 2011

Вы можете использовать length/2 для этого!

?- Xs = [1,2,3|_], length(Xs, N).
Xs = [1,2,3],
N = 3 ;
Xs = [1,2,3,_G1022],
N = 4 ;
Xs = [1,2,3,_G1022,_G1025],
N = 5

Однако мне не ясно, что вы хотите описать здесь. Если вы хотите придерживаться наименьшего решения, используйте once(length(Xs, N)).

1 голос
/ 11 ноября 2011

Вы можете закрыть открытый список следующим образом:

close_list([]) :- !.

close_list([_ | T]) :-
    close_list(T).

т.е. вам нужно пройти через все элементы, чтобы добраться до переменной tail, а затем связать его с пустым списком.

Использование:

?- List = [a, b, C, d, 2.2 | _], close_list(List).
List = [a, b, C, d, 2.2].

Если вы удерживаете переменную, привязанную к хвосту, тогда это становится намного проще:

?- List = [a, b, C, d, 2.2 | Tail], Tail = [].
List = [a, b, C, d, 2.2],
Tail = [].
...