2015-03-10 3 views
1

Я пытаюсь написать предикат one_occurence(L1, L2), который является истинным, если каждый элемент L1 встречается один раз в L2.Списки соответствия L1 с L2 в прологе

delete([H|T], H, TN) :- delete(T, H, TN). 

delete([H|T], E, [H|TN]) :- \+ H = E, delete(T, E, TN). 

delete([], _, []). 

/*one_occurence(L,LN) is true if a list LN is identical to a list L 
    without all repeated elements.*/ 

one_occurence([],[]). 

one_occurence([H|T], [H|TU]) :- delete(T, E, TN), one_occurence(TN, TU). 

Но когда я спрашиваю one_occurence([a,b,a,a,b,c,d,c],N) я получаю N=[a,a,c,c], что неправильно. Я должен получить N=[a,b,c,d]. Что я делаю не так?

+0

Вы можете написать 'H \ = é' вместо '\ + H = E'. Кроме того, когда вы говорите, что хотите, чтобы 'one_occurrence (L1, L2)' был истинным *, если каждый элемент 'L1' встречается один раз в' L2' *, означает ли это, что вы хотите 'one_occurence ([a, a, b, b , c, c], [a, b, c, d, e]), чтобы быть правдой? Потому что это действительно соответствует вашему описанию. Возможно, вы имеете в виду * ... и 'L2' не состоит из других элементов *. – lurker

ответ

1

, что я делаю неправильно?

просто опечатка, вы mispelled переменная H в E:

one_occurence([],[]). 
one_occurence([H|T],[H|TU]) :- delete(T,H,TN), one_occurence(TN,TU). 

SWI-Prolog компилятор предупредит вас о таких проблемах ...

+0

Im using sicstus proog :(!!! –

+0

Спасибо большое, что было проблемой !!! Теперь он работает просто отлично !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! –

0

Свиной пролог имеет: list_to_set (+ List,? Set).

или с нуля:

mymember(X,[X|_]). 
mymember(X,[_|T]) :- mymember(X,T). 

not(A) :- \+ call(A). 



set([],[]). 
set([H|T],[H|Out]) :- 
not(mymember(H,T)), 
set(T,Out). 
set([H|T],Out) :- 
mymember(H,T), 
set(T,Out). 

once_occurrence(L1,L2):-set(L1,L2). 
+0

спасибо большое, у меня была простая синтаксическая ошибка, которую Капеллик обнаружил, что решил ошибку! спасибо большое, и двое из вас !!!!! ты лучший!! –

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