Мне нужно удалить только одно вхождение в список. На самом деле не имеет значения, первый или последний. Один матч нужно удалить.Удаление первого вхождения в список - пролог
У меня возникли проблемы с пониманием того, почему следующее не работает должным образом.
deleteOne(_,[],[]).
deleteOne(Term, [Term|Tail], Result) :-
deleteOne(Term, [], [Result|Tail]), !.
deleteOne(Term, [Head|Tail], [Head|TailResult]) :-
deleteOne(Term, Tail, TailResult), !.
Выход
41 ?- deleteOne(5,[2,3,1,5,2,3,1],X).
X = [2, 3, 1, 5, 2, 3, 1].
Это работает, когда я заменить термин с пустой строкой или некоторой случайной строки.
deleteOne(Term, [Term|Tail], Result) :-
deleteOne("", Tail, Result), !.
Выход
41 ?- deleteOne(5,[2,3,1,5,2,3,1],X).
X = [2, 3, 1, 2, 3, 1].
Но я не думаю, что это лучшее решение по многим причинам. Не для моей текущей проблемы, но, например, для более длинных списков. Или, если список содержит пустую строку - не знаю, возможно ли это в Prolog.
Почему не первый пример работы? И какие существуют другие решения?
Теперь я вижу, где я совершил свою ошибку. Рекурсия все же иногда меня смущает и глупо думает. Благодарим за то, что вы дали понять это и предложили лучшее решение. –