prolog - 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 实现,整数和浮点数之间的差异变得很重要。
推荐阅读
- css - 有没有办法改变滑块的默认高度
- azure-automation - 自动化账户 rubbook 查询
- c# - 有没有办法交换整个瓷砖调色板,而不仅仅是一些瓷砖?
- go - 如何从 Go 智能合约(链码)生成 ByteCode 和 Abi?
- gradle - 为什么“grails assemble”和“gradle assemble”产生不同的WAR档案
- mongodb - Mongo 查询 $exists:false 未按预期运行
- java - Java 11:谓词或/和可选
- android - 为什么我的应用在实现导航图时在 mainActivity 中添加片段后似乎没有响应?
- plsql - 我的代码执行时间太长有没有有效的方法来做到这一点
- javascript - 为什么我的无限循环在异步函数中时会阻塞?