Я новичок в Prolog и как упражнение хочу создать предикат инверсии списка. Он использует add_tail
предиката, который я сделал ранее — некоторые части могут быть лишними, но я не забочусь:Почему мой предикат Prolog инвертирует/2 не работает?
add_tail(A, [], A) :-
!.
add_tail([A|[]], H, [A,H]) :-
!.
add_tail([A|B], H, [A|C]) :-
add_tail(B,H,C).
Он работает так же, как встроен предикат append/3
:
?- add_tail([a,b,c], d, A).
A = [a, b, c, d].
?- append([a,b,c], [d], A).
A = [a, b, c, d].
Когда я использую append
в мой invert
предикат, он отлично работает, но если я использую add_tail
, он не:
invert([], []).
invert([A|B], C) :-
invert(B, D),
append(D, [A], C).
invert2([], []).
invert2([A|B], C) :-
invert2(B, D),
add_tail(D, A, C).
?- invert([a,b,c,d], A).
A = [d, c, b, a].
?- invert2([a,b,c,d], A).
false. % expected answer A = [d,c,b,a], like above
Что такое моя ошибка? Спасибо!
s (X) для смещения фокуса на более общих целей. – repeat