2013-02-28 4 views
0

Я пытаюсь заполнить список структурами, которые у меня есть в другом списке, но отфильтровывает выделение, используя один из аргументов (введенный пользователем, Тип) структуры, и я не могу похоже, правильно рекурсия, помощь будет очень оценена.выберите из списка в прологе

selectOmnibus([],_,[]). 
selectOmnibus([H|T],Type,[O|R]):- 
     member(O,[H|T]), 
    O = omnibus(Type,_,_,_,_), 
    selectOmnibus(T,Type,R). 

ответ

0

Вы очень близко. Ваш базовый случай в порядке. Поскольку вы выполняете рекурсию вручную, вам не нужно использовать member/2. Вам также не хватает другого индуктивного корпуса, где O не соответствует типу структуры.

selectOmnibus([], _, []). 
selectOmnibus([O|T], Type, Result) :- 
    O = omnibus(Type,_,_,_,_) 
    -> (selectOmnibus(T,Type,R), Result = [O|R]) 
    ; selectOmnibus(T, Type, Result). 

Попробуйте это. Если это не так, это поможет увидеть пример ввода и вывода.

Edit: вы можете отделить пункты, как это:

selectOmnibus([], _, []). 
selectOmnibus([O|T], Type, [O|R]) :- 
    O = omnibus(Type,_,_,_,_), 
    selectOmnibus(T,Type,R). 
selectOmnibus([O|T], Type, R) :- 
    O \= omnibus(Type,_,_,_,_), 
    selectOmnibus(T,Type,R). 

Обратите внимание, что вы должны повторить тест перевернутой. Вы можете добавить разрез, чтобы сделать его более эффективным, но вам нужно повторить обратный тест или у вас не будет «обратной правильности», потому что можно будет ввести третье предложение путем обратного отсчета, и там ничего не будет убедитесь, что вы не отбрасываете законные омнибусы.

+0

помогли за настоящие, настоящие приятные, спасибо большое !!! – jmiguel

+0

еще одна вещь, было бы нормально заменить -> на, ?? – jmiguel

+0

, что только в том случае, если я разделяю предложение двумя способами: один, если O унифицирован, а другой - иным. selectOmnibus ([], _, []). selectOmnibus ([O | T], Тип, Результат): - O = omnibus (Тип, _, _, _, _) , (selectOmnibus (T, Тип, R), Результат = [O | R]) , selectOmnibus ([O | T], тип, результат): - \t \t O \ = омнибус (тип, _, _, _, _) \t \t, selectOmnibus (T, тип, результат). – jmiguel

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