如何用L编写谓词双列表(L,R)是数字列表,R也是一个列表,长度与L相同,每个元素都加倍。
示例:
?- doublelist([-1, 0, 3], L).
L = [-2, 0, 6].
我是初学者,我很困惑自己写一个。请帮忙。
答案 0 :(得分:2)
首先写下你的例子:
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 = ???? .
答案 1 :(得分:2)
maplist(\I^D^(D is 2*I), Is, Ds).
这使用maplist/3
中定义的高阶谓词library(lambda)和lambda表达式。
答案 2 :(得分:0)
或者只是使用
double_list(Is,Ds) :- findall(D,(member(I,Is),D is 2*I),Ds).
对于那些对maplist感到不舒服的人。