prolog - Prolog程序firstlast没有递归?
问题描述
如果列表具有相同的第一个和最后一个元素但没有仅使用附加谓词进行递归,我将如何编写一个像下面这样成功的序言程序?
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).
示例查询:
?- firstlast([1,2,3,1]).
Yes
?- firstlast([1,2,3]).
No
解决方案
我认为您的谓词缺少一个边缘情况:单例列表:在一个只有一个元素的列表中,第一个和最后一个元素是相同的。
firstlast([_]).
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).
您可以使用append/3
以下方法获取最后一个元素:
last(L, Last) :-
append(_, [Last], L).
由于将 附加[Last]
到某个列表,因此这项工作只能产生一个带有Last
最后一个元素的列表。由于该列表是L
,并且append/3
可以朝那个方向工作,因此我们可以获得最后一个元素。例如:
?- append(_, [Last], [1,4,2,5]).
Last = 5 ;
false.
我认为有了这个提示,您应该能够在不递归的情况下解决问题。
推荐阅读
- gpu - 谷歌 Colab 使用带有“gpu_hist”的 XGBoost 突然变慢了
- android - 无法获取“https://jitpack.io/com/google/android/gms/play-services-basement/maven-metadata.xml”。从服务器收到状态码 403:Forbidden
- react-native - React Native 中布局显示方向错误(使用 Expo)
- c++ - 为什么这些 CRTP 模式中只有一种可以编译?
- sql - SQL Dense Rank with Case When
- multidimensional-array - 将嵌套 Json 数组中的值检索到谷歌表格中
- regex - 常用表达
- arrays - 如何将多个表传递给 VBA 函数并返回?
- javascript - 未定义传递给 onclick 属性的类函数
- java - 如何限制休眠条件 API 获得的结果?