1

如何编写谓词 doublelist(L, R) ,其中 L 是数字列表,R 也是一个列表,长度与 L 相同,每个元素都加倍。

例子:

?- 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中定义的高阶谓词和 lambda 表达式。

于 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).

对于那些对 maplist 感到不舒服的人。

于 2012-10-10T07:12:52.967 回答