2015-12-01 6 views
0

У меня есть рекурсивный предикат, а вывод этого вызова добавляется к списку с append/3. Таким образом, выход будет списком списков. Моя проблема в том, что иногда append/3 вызывается что-то вроде этого:Пролог список «списков» только с одним элементом

append([[2]], [1,2,3,4], L). 

И выход это [[2], 1,2,3,4]. Я хотел бы проверить перед append/3, что первый элемент - это список списков только с одним элементом, но до сих пор мне не удалось создать шаблон, который соответствует ему.

Так что мой вопрос: как я могу проверить, есть ли что-то в списке?

+0

'A' список ровно один список тогда и только тогда' A = [[]]]; A = [[_ | _]] 'истинно. 'A' - это список точно одного списка одного элемента iff' A = [[_]] 'is true. – lurker

+0

@lurker 'A = [[]]' будет верным для списка списков списков с любым количеством элементов, например. '[[[1,2,3,4,5]]]' ([demo] (http://ideone.com/oCnvav)). Я не уверен, что OP хочет сопоставить такие списки. – dasblinkenlight

+0

@dasblinkenlight ах да, ты прав. А 'A = [[_ | _]]' также может иметь дополнительную вложенность. – lurker

ответ

1

Правило, которое соответствует Пролог атом, ну, atom/1:

is_list_of_list_with_one_element([[X]]) :- atom(X). 
Смежные вопросы