プロローグのリストで数字を二乗するにはどうすればよいですか?
リストには、数値、アトム、およびリストを含めることができます。
例:[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).
X には二乗値が含まれます。基本ケースは、空のリストが受信されたときです。head (A) が数値かどうかを確認してから、数値を 2 乗し、A を A * A に変更します。次に、残りの部分 B に対して 2 乗関数を呼び出します。
私が間違っているところを提案してください。
編集:次のように正解。バストロジストによる。詳細な説明については、彼のコメントをお読みください。
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)
).