1

述語 doublelist(L, R) の書き方 L は数値のリスト、R もリストであり、L と同じ長さで、各要素は 2 倍になります。

例:

?- doublelist([-1, 0, 3], L).  
L = [-2, 0, 6].

私はプロローグの初心者で、自分で書くのに混乱しています。助けてください。

4

3 に答える 3

2
    maplist(\I^D^(D is 2*I), Is, Ds).

これは、 library(lambda)maplist/3で定義されている高次の述語とラムダ式を使用します。

于 2012-10-03T11:54:06.330 に答える
1

例を書き留めることから始めます。

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 = ???? .
于 2012-10-03T11:13:14.593 に答える
0

または単に使用する

double_list(Is,Ds) :- findall(D,(member(I,Is),D is 2*I),Ds).

マップリストが苦手な方へ。

于 2012-10-10T07:12:52.967 に答える