Для чистого решения рассмотрите этот ответ, обратите внимание на другой порядок аргументов.
Но на самом деле ваш вопрос был таков: что не так с вашим решением?
Есть способ ответить на этот вопрос уникальным для Пролога образом. В других языках программирования вам пришлось бы придумывать осмысленные тестовые примеры. Затем вы должны использовать такие тестовые примеры, чтобы увидеть, работает ли ваша реализация. Конечно, это возможно и в Прологе.
Но подумайте о фактической стоимости расчета этих тестовых случаев! Вы должны были бы понять всю связь во всех ее деталях. Вам нужно было бы мысленно представить весь мелкий шрифт о структурах данных. Это довольно интеллектуальное усилие. Ваш пример очень прост, так что усилия кажутся мелочными. Но представьте, что здесь и там добавляются дополнительные детали.
Итак, как мы можем вычислить тестовый пример для предиката, не понимая фактического отношения?
Просто возьмите самый общий запрос. То есть цель с различными переменными во всех аргументах. Для вашего примера это будет deleteall(X, Xs, Ys)
. Теперь наша работа выполнена, и мы можем позволить Прологу заполнить пробелы.
?- deleteall(X,Xs,Ys).
Xs = Ys, Ys = [] ;
Xs = [X] ;
false.
С вашим определением мы получаем два ответа. Первый ответ содержит решения для Xs
, являющегося пустым списком []
. Второй ответ содержит решения для Xs
, являющегося списком из одного элемента. И это все, что описывает ваше отношение.
А как насчет списков, содержащих два или даже больше элементов? Для них нет решений. Так что ваше определение слишком конкретно в этом отношении.
И второй ответ верен для всех Ys
. Например. также deleteall(1,[1],[2,3])
выполняется в соответствии с вашим определением. Еще хуже: deleteall(1,[1],[1]).
Никакого удаления. Так что ваше определение здесь слишком общее.
Где подвох во всем этом? Ну, вы должны писать чистые, монотонные программы. То есть нечистые встроенные функции, такие как !/0
, (\+)/1
, (\=)/2
, (\==)/2
, а также встроенные функции с побочными эффектами не должны использоваться (или использоваться с особой осторожностью).
person
false
schedule
29.05.2012