2014-12-10 3 views
0

То, что я в принципе хочу достичь в том, что данный список списков , я хочу, предикат, который проверяет, является ли элементы списка B являются точно содержатся в перечне A.Пролог, Список списков содержит еще один список точно

Так, например:

= [[1,2], [3,4], [5], []] В = [1,2,3,4, 5]

и

= [[1,2], [3,4], [5], []] В = [2,5,3,4,1 ]

бы привести к истине, но

= [[1,2], [3,4], [5], []] В = [1,2,3,4]

и

= [[1,2], [3,4], [5], []] В = [1,2,3,4,5,6]

оба результата будут ошибочными.

это возможно в прологе?

Точно означает: Заказ не имеет значения, он просто должен содержать все элементы. Также представьте, что список B не содержит дубликатов. Итак, если A будет содержать дубликаты, в результате мы должны получить false.

+1

Конечно, это возможно. В прологе есть * предикаты *, а не * функции *. Они на самом деле не то же самое и не имеют такого же поведения. Вы должны посмотреть на 'flatten/2', который сделает это простым. – lurker

+0

Все еще непонятно, что именно ** означает **, на основе ваших примеров. Означает ли порядок? Что происходит с повторениями? –

+0

[append] (http://www.swi-prolog.org/pldoc/doc_for?object = append/2)/2 может быть и ответить – CapelliC

ответ

1

тривиальный ответ:

?- flatten([[1,2],[3,4],[5],[]], [1,2,3,4,5]). 
true. 

?- flatten([[1,2],[3,4],[5],[]], [1,2,3,4]). 
false. 

?- flatten([[1,2],[3,4],[5],[]], [1,2,3,4,5,6]). 
false. 

Или

foo(A, B) :- % because I don't know how to call it 
    flatten(A, B). 

Если говорить о множествах:

bar(A, B) :- 
    flatten(A, A_flat), 
    sort(A_flat, A_sorted), 
    sort(B, A_sorted). 

Вы можете использовать msort/2, если вы не хотите, чтобы удалить дубликаты.

Если у вас возник вопрос: «Как мне реализовать flatten/2», вы можете найти несколько ответов на SO.