2014-12-07 3 views
1

У меня есть код, который ДОЛЖЕН работать в теории, но это не так. У меня есть функция удаления, которая удаляет все вхождения a и возвращает новый список. Я называю это на каждом шаге и передаю новый список, добавляя голову. вот мой код, который возвращает false.Prolog remove all duplicates function

remv(a, [], []). 
remv(a, [H|T], X) :- H=a, remv(a, T, X). 
remv(a, [H|T],[H|X]):- remv(a, T, X). 

%4 
remvdub([],[]). 
remvdub([H|T],[H|X]) :- remvdub(remv(H,T,A),X). 

может кто-нибудь объяснить, в чем проблема?

+0

Пролог использует предикаты, а не функции. Предикаты выражают отношения и всегда верны или ложны. Вы предполагаете, что 'remv/3' возвращает список, но это не тот случай. Вы должны попробовать изменить второе правило: 'remvdub ([H | T], [H | X]): - remv (H, T, T2), remvdub (T2, X) .'. Правила имеют следующий смысл: для списка '[H | T]' список '[H | X]' является начальным без двойников, если есть список 'T2', который является' T', без какого-либо появления 'H' и' X' - это список 'T2' без каких-либо удвоений. –

+0

эта строка по-прежнему не возвращает правильный ответ. он все еще возвращает false –

+0

Я вижу, что вы делали. По какой-то причине он не работает –

ответ

1

Вы обрабатываете rev как функцию, ожидая, что он «вернет» список w/H. Фактически, он привяжет A к такому списку, так что это должен быть первый аргумент remvdub. То есть:

remvdub([H|T],[H|X]) :- remv(H,T,A), remvdub(A,X). 
+0

ОК, поэтому я думаю, я все еще смущен. Итак, если я пройду, как бы использовать голову и хвост? спасибо за ответ btw –