Вы очень близко. Ваш базовый случай в порядке. Поскольку вы выполняете рекурсию вручную, вам не нужно использовать 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).
Обратите внимание, что вы должны повторить тест перевернутой. Вы можете добавить разрез, чтобы сделать его более эффективным, но вам нужно повторить обратный тест или у вас не будет «обратной правильности», потому что можно будет ввести третье предложение путем обратного отсчета, и там ничего не будет убедитесь, что вы не отбрасываете законные омнибусы.
помогли за настоящие, настоящие приятные, спасибо большое !!! – jmiguel
еще одна вещь, было бы нормально заменить -> на, ?? – jmiguel
, что только в том случае, если я разделяю предложение двумя способами: один, если O унифицирован, а другой - иным. selectOmnibus ([], _, []). selectOmnibus ([O | T], Тип, Результат): - O = omnibus (Тип, _, _, _, _) , (selectOmnibus (T, Тип, R), Результат = [O | R]) , selectOmnibus ([O | T], тип, результат): - \t \t O \ = омнибус (тип, _, _, _, _) \t \t, selectOmnibus (T, тип, результат). – jmiguel