2016-11-23 4 views
0

Я только начинаю изучать Полог, и мне нужно делать следующие вещи: first: Мне нужно написать предикат, который проверяет, список A содержит только некоторые из тех элементов, которые имеют B. (A = [a, b] B = [a, b, c] истинно), я это сделал, но мне также нужно определить, совпадают ли равные элементы обоих списков.Сравнение двух списков в прологе, чтобы определить, являются ли равные элементы обоих списков одинаковыми.

Example: 
A = [b,b,c,c]  (b and c is member of B so its true) 
B = [a,b,b,c,c,d,f,g] 
<--would be true 

Я написал первую часть, но мне еще нужно проверить счет. НО я не могу использовать сортировку и цифры, чтобы проверить это: [ учитель предложил использовать выбрать, но это необязательно

второй: я должен добавить еще одно выражение для предиката, который проверяет, если список C содержит только некоторые из те элементы, которые имеют B (идентичны предыдущей задаче). (C = [a, b] B = [a, b, c]) (но это уже сделано), но я также должен проверить, отображаются ли элементы B в 2 раза в C.

Example: 
A = [b,b,c,c] 
B = [a,b,b,c,c,d,e,f,g] 
C = [b,b,b,b,c,c,c,c] /or/ C=[a,a,b,b,b,b] 
would be true. 

EDIT1: а код, который я написал до сих пор:

subset([ ],_). 
subset([H|T],List) :-  
    member(H,List),  
    subset(T,List).  



p(A,B,C) :-     %this is the predicate in which I have to 
    subset(A,B),    %compile everything together 
    subset(C,B).  
+0

Можете ли вы разместить код, который вы уже писали? – Rodolfo

ответ

0

Первый из них может быть достигнуто путем удаления каждого элемента на B, как они появляются в A, и возвращает то, что осталось, то мы проверяем, что остаток не содержит какого-либо элемента, который находится в A (IE - это одно и то же число).

dontIntersect(L1,L2) :- 
    intersection(L1,L2,[]). 

subset_2([], R, R). 

subset_2([H | T], List, R):- 
    select(H, List, NewList), 
    subset_2(T, NewList, R). 

subset(L1, L2):- 
    subset_2(L1,L2,Remainder), 
    dontIntersect(L1,Remainder). 

Второй очень похож, за исключением того факта, что мы удаляем сразу два элемента из списка.

dontIntersect(L1,L2) :- 
    intersection(L1,L2,[]). 

subset_2([], R, R). 

subset_2([H | T], List, R):- 
    select(H, List, NewList1), 
    select(H, NewList1, NewList2), 
    subset_2(T, NewList2, R). 

subset(L1, L2):- 
    subset_2(L1,L2,Remainder), 
    dontIntersect(L1,Remainder). 
+0

Спасибо, Родольфо! Именно так я и решил решить эту проблему, но еще не смог поместить ее в код. Я подтвердил ваш комментарий, но он появится только тогда, когда я достиг 15 репутации:] Но у меня проблема со второй частью кода, я попытаюсь объяснить это в редактировании, всего лишь секунду: – Pavels

+0

'[trace] 69? - subset3x ([a, b], [a, a, b, b, c]). ... Выход: (10) выберите ([], [b, c], [b, c])? ползучесть ** .. Вызов: (9) списки: пересечение ([a, b], [b, c], [])? ползучесть ** Ошибка: (9) списки: пересечение ([a, b], [b, c], [])? ** ' Я выделил проблему. Он занимает пустой список на этом этапе, поэтому некоторые символы попадают в напоминание. Im в настоящее время думает, как решить эту проблему: D – Pavels

+0

NEVERMIND, извините, все работает, я ошибся, когда я интегрировал ваш код. В любом случае, спасибо вам большое:] – Pavels

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