为什么关注简单程序不起作用?
main :-
squares([1,2,3,4,5], L),
writeln(L).
squares([H|T], Outl) :-
Sq is H*H,
squares(T, [Sq|Outl]).
squares([], []).
输出结果为:
?- main.
false.
用Outl
替换[Outl]
(在squares([H|T], Outl)
中)无济于事。
使用=
和#=
代替或is
也无济于事。
squares([], P)
代替squares([], [])
。
答案 0 :(得分:4)
这是maplist
的绝佳候选人。
定义一个元素的平方:
squared(X, XX) :- XX #= X * X.
然后应用maplist
:
squared_list(L, LL) :- maplist(squared, L, LL).
在这里使用#=
代替is/2
,它的行为更具关系性:
| ?- squared_list([1,2,3], L).
L = [1,4,9]
yes
| ?- squared_list(L, [1,4,9]).
L = [1,2,3] ? ;
(1 ms) no
| ?-
答案 1 :(得分:1)
看看你写的是什么
squares([H|T],Outl):-
Sq is H*H,
squares(T,[Sq|Outl]).
Sq错位,你应该写
squares([H|T],[Sq|Outl]):-
Sq is H*H,
squares(T,Outl).
在计算列表T的其余部分的结果中添加Sq。