Вот ваш код с предложениями о том, почему он не работает:
fourth(_,[]).
fourth(A,[HF|TF]) :-
intersection(A, HF, NewA),
intersection(TF, HF, NewB),
Это не пересечение / 3 , которое вы хотите использовать по двум причинам:
1) он не фильтрует только HF в A.
2) он не работает, если вы вызываете его с элементом, поэтому, по крайней мере, используйте [HF] вместо HF
Вместо этого используйте include / 3 : include (= (HF), A, NewA).См. Документ SWI-pl для получения дополнительной информации.
append(HF, NewB, NewT),
append(NewA, NewA, NewAA),
append(NewA, NewAA, NewAAA),
Лучше использовать append / 2 , особенно для вашего списка NewAAA.
length(NewAAA) == length(NewT),
Вы можете 'т сравнить длины как это.Во-первых, length / 1 не существует во встроенных предикатах swi-pl.Вместо этого сравните непосредственно списки или дважды используйте length / 2 , а затем сравните результаты.
select(HF, TF, NewTF),
fourth(A, NewTF).
Только удаление один раз HT в TF приведет к сбою вашего алгоритма.Вам необходимо удалить все вхождения HT в TF, например, вычитать / 3 ...
Если вы хотите рабочее решение, соответствующее вашей первоначальной работе, я добавлю его,так что не стесняйтесь спрашивать, но так как это было помечено как домашнее задание, я сначала дам вам эти рабочие поводыри ...