список списков для списка без глубины - PullRequest
2 голосов
/ 04 января 2011

Я пытался создать функцию, которая принимает список списков и возвращает новый список с элементами исходного, но без глубины.fe:

?- function([a,[b,c],d],X).  
X = [a,b,c,d]  
?- function([[a],[[b]],[c,[d]]],X).  
X = [a,b,c,d]

и я нашел в руководстве следующий код:

function([],[]):- !.  
function([H|T],[H|R]):- \+ lst(H), !, function(T,R).  
function([H|T],L):- function(H,L1), function(T,L2),
append(L1,L2,T).

К сожалению, нигде не сказано, какая функция lst (H).
Плюс я не могу понять, чтоточно lst () делает и определяет его, и в результате он получается неопределенным.

Если бы кто-нибудь мог понять, как это должно быть определено, или просто дать мне альтернативу о том, как сделать то, что я пытаюсь, я был бы благодарен ..

Ответы [ 2 ]

2 голосов
/ 04 января 2011

Как уже сказал Павел, попробуйте is_list / 1 в SWI или напишите свой собственный простой предикат, который будет истинным, если его аргумент является списком. Более того, напишите версию, которая выдает ошибку инстанцирования, если в верхнем списке все еще содержатся переменные на том основании, что информации о том, что делать, недостаточно: переменная может быть позже создана в виде списка, и в этом случае предикат должен удалить вложенность но, очевидно, не мог в то время, когда его назвали.

1 голос
/ 04 января 2011

Мне кажется, что lst (X) должен быть истинным, если X является списком.В SWI эквивалентный предикат называется is_list / 1.В вашем коде + используется для отрицания, но я знаком с \+.(ах, я вижу, сайт проглатывает \)

Редактировать: последний T в последнем ряду должен быть L:

function([H|T],L):- function(H,L1), function(T,L2), append(L1,L2,L).

Я пробовал, и он работает в SWI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...