Ho do I квадратные числа в списке в прологе?Пролог: квадратные числа в списке
Список может содержать числа, атомы и списки.
, например: [a,b,2,3,4,[3],[c,d,9]]
и ответ должен быть [a,b,4,9,16,[3],[c,d,9]]
. Как мы видим в ответе, это должно быть мелкое квадратирование значений в списке.
2-> 4
3-> 9
4-> 16
То, что я пытался до сих пор,
square([],X).
square([A|B],X):-number(A), A is A*A, square(B,X).
Х будет содержать в квадрат значений. Базовый регистр - это когда получен пустой список. Я проверяю, является ли голова (A) числом, затем я перехожу к квадрату числа и меняю A на A * A. Затем продолжайте и вызовите квадратную функцию для оставшейся части B.
Пожалуйста, предложите, где я делаю неправильно.
EDIT: Правильный ответ следующим образом. Абатологом. Пожалуйста, прочитайте его комментарий для подробного объяснения.
squared_members([], []).
squared_members([L|Ls], [SqrdL|SqrdLs]) :-
number(L),
SqrdL is L * L,
squared_members(Ls, SqrdLs).
squared_members([L|Ls], [L|SqrdLs]) :-
\+number(L),
squared_members(Ls, SqrdLs).
И
squared_members([], []).
squared_members([L|Ls], [M|Ms]) :-
(number(L)
-> M is L * L, squared_members(Ls, Ms)
; M = L, squared_members(Ls, Ms)
).
Я считаю, что эта проблема совсем недавно появился: http://stackoverflow.com/questions/19736345/кв-все-члены-в-список, в том числе-подсписке-пролог-без помощи-MapList. Ваш 'square ([A | B], X)' имеет пару проблем. Во-первых, вы не можете переназначить переменную в Prolog. После создания экземпляра они остаются. Во-вторых, после того, как вы построили квадрат «A», вы пройдете результат, так как вы не можете изменить исходный список ввода по той же причине. – lurker
mbratch спасибо, что направил меня на это решение. Это глубокий предикат для возведения в квадрат. Я пытаюсь сделать мелкий предикат. Однако это помогло. – celeritas