为sqrt_list(NumberList, ResultList)
中的每个数字编写一个谓词ResultList
,将其NumberList
绑定到一个由数字及其平方根组成的对的列表中。
例如:
?- sqrt_list([1,4,9], Result).
Result = [[1,1.0], [4,2.0], [9,3.0]]. % expected
答案 0 :(得分:2)
将元谓词maplist/3
与library(lambda)
结合使用:
:- use_module(library(lambda)).
list_withsqrts(Es, Xss) :-
maplist(\E^[E,S]^(S is sqrt(E)), Es, Xss).
示例查询:
?- list_withsqrts([1,4,9], Xss).
Xss = [[1,1.0], [4,2.0], [9,3.0]].
一些注意事项:
使用固定长度列表而不是相同含义的复合词通常被认为是不好的编码样式。
查找良好的关系名称是Prolog编程的一项重要技能。在上面的代码中,我使用list_withsqrts
而不是sqrt_list
。不出名,但可以说更好一些...
答案 1 :(得分:0)
继续将原始列表划分为子列表,以一个数字为头,其余数字为尾。重复相同的操作,请注意,Prolog内置函数sqrt计算平方根,并且需要使用is进行求值才能实际进行计算: 例如:
?- X is sqrt(5).
X = 2.23606797749979.
然后将每个结果与numberList一起添加到resultList头部。
ResultHead=[Head|[SquareRoot]]