2015-10-03 5 views
1

У меня уже есть этот код, чтобы соответствовать, если любые числа в списке соответствуют любым номерам в другом списке. Однако мне нужно изменить мою рекурсию, чтобы она вернула false, если один и тот же номер найден в одной позиции в обоих списках.Пролог: сопоставление элементов в отдельных двух списках

Например:

[5,3,4,6,2] совместим с [3,1,2,2,7]; и [1,3,4,9,2] несовместим с [4,5,2,9,8], потому что оба списка имеют 9 в 4-й позиции.

Вот код, который я до сих пор:

common_elements([], L) :- 
    fail. 
common_elements([H|T], L) :- 
    memberchk(H, L), !. 
common_elements([H|T], L) :- 
    common_elements(T, L). 

SWI-Prolog пример входы и выходы для текущего кода:

?- common_elements([1,2,3,4],[6,7,8,9]). 
false. 

?- common_elements([1,2,3,6],[6,7,8,9]). 
true. 
+0

У обоих списков должна быть одинаковая длина? – repeat

+0

Должны ли элементы списка быть цифрами? – repeat

+1

Если списки имеют одинаковую длину, вы можете просто сделать: 'maplist (dif, L1, L2)'. – lurker

ответ

1

Как (почти) все предикаты с обработкой списка, вы может разделить свой предикат в двух типах положений:

  • базовых п.п.: во многих случаях эти списки относятся к пустым спискам. Вот это, например:

    compatible([],_). 
    compatible(_,[]). 
    
  • индуктивные положения: в этом случае оба списка не являются пустыми. В этом случае вам нужно сравнить головку s из двух списков. Если не равны, вы делаете рекурсивный вызов:

    compatible([HA|TA],[HB|TB]) :- 
        HA \= HB, 
        compatible(TA,TB). 
    

    в рекурсивном вызове, вы просто использовать хвост S обоих списков.

Теперь присоединяемых оба положения:

compatible([],_). 
compatible(_,[]). 
compatible([HA|TA],[HB|TB]) :- 
    HA \= HB, 
    compatible(TA,TB). 

Вы можете сделать это немного более эффективные (и атомное с помощью разреза):

compatible([],_) :- 
    !. 
compatible(_,[]). 
compatible([HA|TA],[HB|TB]) :- 
    HA \= HB, 
    compatible(TA,TB). 

Demo (swipl):

?- compatible([5,3,4,6,2],[3,1,2,2,7]). 
true. 

?- compatible([1,3,4,9,2],[4,5,2,9,8]). 
false. 
+0

Отлично, хорошее объяснение тоже! Благодаря! – sanic

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