2016-03-07 2 views
0

Я полный noob, пытающийся написать предикаты, и я немного застрял. Раньше я делал предикат под названием «remDuplicates/2», который бы указывал true, если 2-й список предиката был первым списком с удаленными дубликатами. Пожалуйста, см. Код ниже для предиката, который я использую.Prolog predicate - возвращает список с дубликатами, удаленными из определенного предиката

remDuplicates([], []). 
    remDuplicates([H|T], [H|T1]) :- subtract(T,[H],T2), remDuplicates(T2, T1). 

Однако теперь я пытаюсь создать новый предикат, который использует «remDuplicates», чтобы удалить дублирование из одного списка, называется «remT/1». 'remT/1', который принимает один параметр, должен использовать предикат 'remDuplicates' для удаления любого дублирования, а затем возвращать новый список (без какого-либо дублирования).

Я попытался как-то начать, но на самом деле, я понятия не имею, куда идти. Пожалуйста, ознакомьтесь с началом моей попытки ниже;

remT([]). 
    remT([H|T]) :- remDuplicates([H|T],[H|T]). 

Очень понравилась бы помощь в этом. Благодарю.

+1

Там обычно нет такого понятия, как «возвращение» в Прологе, ни есть изменяемая переменные. Зачем вам такой предикат? –

ответ

0

Как Борис говорил, в Прологе нет такого понятия, как "возвращение", однако, вы можете позвонить remDuplicates/2, как это:
        remDuplicates ([1,2,2,3 , 4,5,7,5], T).
Таким образом, T будет окончательным списком без дубликатов. Затем вы можете использовать его внутри большего предиката или просто запустить его на терминале, так как он напечатает на экране что-то вроде «T = [1,2,3,4,5,7]».
Вы также можете проверить предикат sort/2, который имеет аналогичный результат, как ваш, уже встроенный в SWI-Prolog.

Надеется, что это помогло,
Андре Пинта

+0

Привет @DrAntarctica - спасибо за совет. Есть ли в любом случае, что я могу использовать предикат «remT» без необходимости вставлять переменную самостоятельно? (т. е. поместить переменную в переменную «remT» для распечатки, без необходимости делать это - как моя попытка ниже). –

+0

remT ([]). remT ([H | T], X): - remDuplicates ([H | T], X). –

+0

Вы можете иметь remT/1 следующим образом: remT (List): - remDuplicates (List, X), write ('New List:'), write (X). Редактировать: Я не знаю, правильно ли я понял, но не стесняйтесь прояснить, правильно ли я это понял. – DrAntarctica

Смежные вопросы