append/3
ли вам модульного тестирования это? Правильно ли он работал? Неверная реализация вашего append/3
. Первый пункт
первый пункт:
append(A , [] , [A] ).
просто создает список длины 1 из его 1-го аргумента (какой бы она ни). Учитывая, что, если бы вы сказали:
append([1,2,3] , [] , X) .
Вы бы получить обратно:
X = [ [1,2,3] ]
Список длины 1, с единственным пунктом в нем содержится быть оригинальным первым аргументом. Второе положение является так же неверно:
append(A , B , [A|B]).
Вставляет 1-й аргумент — все, что могло бы быть, и во всей своей полноте — как глава этого списка. Учитывая, что, если бы вы сказали что-то вроде:
append([1,2,3] , [a,b,c] , X) .
Вы бы получить обратно:
X = [ [1,2,3] , a , b , c ] .
Список длиной 4, первый элемент которого является оригинальным первым аргументом.
Пролога является описательным языком: вы описать раствор и пусть работу двигателя вещь. append/3
утверждает, что список (3-й аргумент append/3
представляет конкатенацию 1-го аргумента и 2-го аргумента
Вот реализация append/3
, упрощена для ясности:.
append([] , RL , RL) . % The concatenation of an empty left-hand list and a right hand list is the right hand list.
append([LH|LT] , RL , CL) :- % The concatenation of a non-empty left-hand list and a right-hand list is true IF:
CL = [LH|CT] , % - The left-hand head and the concatenation head are the same, AND
append(LT , RL , CT) % - recursively, the concatenated tail represents the conconcatenation of the left-hand tail and the right-hand list.
. % Easy!
Как вы попы пунктов от . список с левой стороны, она в конечном счете разлагается завершающим особый случай Это может быть упрощено до классической реализации:
append([] , RL , RL ) .
append([LH|LT] , RL , [LH|CT]) :- append(LT , RL , CT) .
reverse/3
Аналогичным образом, ваша реализация reverse/3
неверна. Ваш первый пункт:
reverse([], ReversedList).
довольно много говорит о том, что почти все наоборот. Поскольку ваша переменная ReversedList
никогда не упоминается, ваша реализация Prolog должна хотя бы вызывать предупреждение об одноэлементных переменных здесь. Многие реализации делают ошибку.
Ваш второй пункт:
reverse([A,B], ReversedList) :-
reverse(B, TemporaryList),
append(A, TemporaryList, ReversedList).
говорит, что реверс списка с 2-позиционным ([A,B]
) получается
- реверсивного 2-й пункт в списке (
B
), и
- добавление 1-го элемента (
A
) к этому.
Не совсем точное описание решения. Вы можете попробовать что-то вроде
reverse([] , []) . % The empty list is already reversed, what with it being atomic and all.
reverse([H|T] , R ) :- % a non-empty list can be reversed by decomposing it into its head and tail, and
reverse(T,T1) , % - reversing the tail, and
append(T1,H,R) . % - appending the head to the now-reversed tail.
Это довольно нестандартное определение [ 'append'] (http://www.swi-prolog.org/pldoc/man?predicate=append/3), как правило,' append' определено для работы над списками, например 'append ([a, b, c], [x, y, z], L) ==> L = [a, b, c, x, y, z]', http://stackoverflow.com/questions/11539203/how-do-i-append-lists-in-prolog – npostavs
Кажется, это не проблема. Если я переименую 'append' в' my_append', это то же самое – incud
Вам также нужно перезапустить систему Prolog. Кроме того, существует '[A, B]', который должен, вероятно, читать '[A | B]' и многое другое ... – false