Вместо того, чтобы пытаться исправить существующий код, давайте попробуем решить проблему заново.Вы показываете примеры:
ListA: [], ListB: [] => ResultList: []
ListA: [], ListB: [a,b,c] => ResultList: [[a],[b],[c]]
ListA: [1,2], ListB: [a,b,c] => ResultList: [[1,2,a],[1,2,b],[1,2,c]]
и
?- extend_my_path([a,b,c], [1,2], [], Result).
Result = [[1,2,a],[1,2,b],[1,2,c]]
Третий аргумент выглядит совершенно неуместным, а первый и второй аргументы меняются местами по сравнению с первым пакетом примеров,так скажем, это должно быть
?- ListA = [1,2], ListB = [a,b,c], extend_my_path( ListA, ListB, ResultList).
ResultList = [[1,2,a],[1,2,b],[1,2,c]]
Итак мы начинаем кодировать , просто перечисляя случаи, которые, как мы знаем, должны выполняться:
extend_my_path_ex( [], [], []).
extend_my_path_ex( [], [a,b,c], [[ a],[ b],[ c]]).
extend_my_path_ex( [1,2], [a,b,c], [[1,2,a],[1,2,b],[1,2,c]]).
Обобщение дает нам
extend_my_path3( [], [], []).
extend_my_path3( OneTwo, [A,B,C], [OneTwoA,OneTwoB,OneTwoC]):-
append( OneTwo, [A], OneTwoA),
append( OneTwo, [B], OneTwoB), % ... right? all the examples produce
append( OneTwo, [C], OneTwoC). % the same answers. check it!
А что, если их было только два?
extend_my_path2( [], [], []).
extend_my_path2( OneTwo, [B,C], [OneTwoB,OneTwoC]):-
append( OneTwo, [B], OneTwoB),
append( OneTwo, [C], OneTwoC). % ... right?
Так что мы можем просто переписать его синтаксически как
extend_my_path3( [], [], []).
extend_my_path3( OneTwo, [A | [B,C]], [OneTwoA | [OneTwoB,OneTwoC] ]):-
append( OneTwo, [A], OneTwoA),
extend_my_path2( OneTwo, [B,C], [OneTwoB,OneTwoC] ).
Но смотри!Что бы мы ни делали с тремя элементами, мы делаем то же самое, по существу, с двумя.
И почему мы должны ограничиваться только тремя, или двумя случаями элементов?В них нет ничего особенного.Давайте обобщим еще раз,
extend_my_path( [], [], []).
extend_my_path( OneTwo, [A | B_C], [OneTwoA | OneTwoB_OneTwoC ]):-
append( OneTwo, [A], OneTwoA),
extend_my_path( OneTwo, B_C, OneTwoB_OneTwoC ).
Можете ли вы взять его отсюда?