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 实现,其中整数和浮点数之间的差异变得很重要。
我最近开始研究逻辑范式,正在努力解决以下问题。
如何递归实现 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 实现,其中整数和浮点数之间的差异变得很重要。