在Prolog中创建给定列表的平方根表

时间:2016-04-02 02:29:20

标签: list prolog

我是Prolog的新手,并尝试开发一个简单的代码来获得以下输出。

?-sqrt_table(7, 4, Result).
Result = [[4, 2.0],[7, 2.64575],[6, 2.44949],[5, 2.23607]] ;
false.

然而,我得到的输出是

?- sqrt_table(4,7,X).
X = [[5, 2.23606797749979], [[6, 2.449489742783178], [[7, 2.6457513110645907], []]]].

我认为问题出在get_sqrt / 2创建的嵌套列表中。如果我可以把它弄平为元组,我认为它可能会起作用。非常感谢您的想法和帮助。

%main predicate
sqrt_table(N,M,Result):-
        full_list(N,M,Out),
        get_sqrt(Out,[Rest,Result]).

%Creates a range of outputs  within the given upper and lower limits
range(Low,Low,High).
range(Out,Low,High):-
        NewLow is Low+1,NewLow=<High,
        range(Out,NewLow,High).

%Creates a list of the outputs created by range/3
full_list(Low,High,Out):-
        findall(X,range(X,Low,High),Out).


%Calculates the square root of each item in the list and gives a list consisted
%of sublists such that [Input,Squareroot of the input]
get_sqrt([],[]).
get_sqrt([H|T],[[H,Sqrt],SqrtRest]):-
        SqrtOf_H is sqrt(H),
        get_sqrt(T,SqrtRest),
        Sqrt = SqrtOf_H.

提前致谢。

1 个答案:

答案 0 :(得分:2)

get_sqrt/2第二个条款的标题中,只需撰写[[H,Sqrt]|SqrtRest],即使用(|)/2代替(,)/2

事实上,使用更具可读性和更具惯用性的[H-Sqrt|HSqrts]会更好,即使用(-)/2表示

而在第二个事实中,更好的方法是简单地使用例如:简单地说明一个元素的关系:

integer_isqrt(I, I-Sq) :- Sq is sqrt(I).

然后使用 maplist/3将这些元素的列表相互关联:

?- maplist(integer_isqrt, [0,1,2,3,4], Ls).
Ls = [0-0.0, 1-1.0, 2-1.4142135623730951, 3-1.7320508075688772, 4-2.0].

P.S。:使用flatten/2始终表明您的数据结构存在问题,您应该完全避免 flatten/2。如果您需要删除一级嵌套,请使用append/2。但在这种情况下,两者都不需要。