首页 > 解决方案 > 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).

我的方式正确吗?

标签: prolog

解决方案


它不应该比

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 实现,整数和浮点数之间的差异变得很重要。


推荐阅读