squares/2 的递归实现

Recursively implementation of squares/2

我最近开始研究逻辑范式,正在努力解决以下问题。

如何递归实现 squares/2 谓词,该谓词采用变量 X 和正整数列表 Y 以及最多 X 的平方列表Y 个元素?

?- squares(X, [1, 2, 3, 4, 5, 6]).
X = [1, 4, 9, 16, 25, 36] .

我的尝试:

squares([], []).
squares([H|T], [X|Squared_list]):-
    X is H*H,
    squares(T, Squared_list).

我走对了?

应该不会比

复杂多少
squares( []     , []     ) .  % squaring the empty list yields the empty list, eh?
squares( [X|Xs] , [Y|Ys] ) :- % for non-empty lists, pull the head of each list, and
  X is Y*Y,                   % - X is Y^2,
  squares(Xs, Ys)             % - then, recurse down on the tails
  .                           % Easy!

诀窍是让它成为双向的,所以 squares([1,4,9], X). 产生

X = [1,2,3]

同时 squares(X, [1,2,3]). 产生

X = [1,4,9]

为此,您需要通过一些类型检查来扩展它:

squares( []     , []     ) .
squares( [X|Xs] , [Y|Ys] ) :-
    nonvar(Y),
    X is Y^2,
    squares(Xs,Ys)
    .
squares( [X|Xs] , [Y|Ys] ) :-
    nonvar(X),
    Y is sqrt(X),
    squares(Xs,Ys).

但是,您会发现这里有一些边缘情况,具体取决于您的 Prolog 实现,其中整数和浮点数之间的差异变得很重要。