述語 doublelist(L, R) の書き方 L は数値のリスト、R もリストであり、L と同じ長さで、各要素は 2 倍になります。
例:
?- doublelist([-1, 0, 3], L).
L = [-2, 0, 6].
私はプロローグの初心者で、自分で書くのに混乱しています。助けてください。
maplist(\I^D^(D is 2*I), Is, Ds).
これは、 library(lambda)maplist/3
で定義されている高次の述語とラムダ式を使用します。
例を書き留めることから始めます。
double_list([-1,0,3],[-2,0,6]).
これは完全に有効な Prolog です。あらゆる方向に使用できます。
?- double_list([-1,0,3],L).
L = [-2,0,6].
?- double_list([-1,0,3],[-2,0,6]).
Yes.
そのため、より一般的なものにする必要があります。最初のステップとして、それが何を意味するのかを書き留めます。
double_list([-1,0,3],[-2,0,6]):-
(-2) is 2*(-1),
0 is 2*???,
6 is ?????.
次のステップでは、数値を変数に置き換えます。
double_list([-1,0,3],[-2,0,6]):-
A1 is (-1), B1 is (-2), B1 is 2*A1,
A2 ????, B2 ????, B2 is 2*??,
A3 ????, B3 ????, B3 ???????.
これから続けられますか?パターンが見えますか?
double_list([X1,X2,X3],[Y1,Y2,Y3]):-
......
これで、長さ 3 のすべてのリストで機能する述語ができました。次に、
double_list([X1 | T1], [Y1 | Z1]):-
......
double_list( [], ZN) :- ZN = ???? .
または単に使用する
double_list(Is,Ds) :- findall(D,(member(I,Is),D is 2*I),Ds).
マップリストが苦手な方へ。