首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog -回文函数式

Prolog -回文函数式
EN

Stack Overflow用户
提问于 2011-12-29 23:26:07
回答 5查看 19.8K关注 0票数 5

我正在尝试用Prolog编写一个谓词palindrome/1,当且仅当它的列表输入由回文列表组成时,它才为真。

例如:

代码语言:javascript
复制
?- palindrome([1,2,3,4,5,4,3,2,1]).

是真的。

有什么想法或解决方案吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-29 23:29:57

回文列表是一个向后读取相同列表的列表,因此您可以反转列表以检查它是否产生相同的列表:

代码语言:javascript
复制
palindrome(L):-
  reverse(L, L).
票数 9
EN

Stack Overflow用户

发布于 2011-12-30 02:27:29

看起来每个人都在投票支持基于reverse/2的解决方案。我猜你们脑海中有一个反/2的解决方案,即给定列表中的O(n)。带有累加器的东西:

代码语言:javascript
复制
 reverse(X,Y) :- reverse(X,[],Y).

 reverse([],X,X).
 reverse([X|Y],Z,T) :- reverse(Y,[X|Z],T).

但也有其他方法可以检查回文。我想出了一个利用DCG的解决方案。可以使用以下规则:

代码语言:javascript
复制
 palin --> [].
 palin --> [_].
 palin --> [Border], palin, [Border].

哪种解决方案更好?好的,让我们通过Prolog系统的profile命令来做一些统计。结果如下:

因此,也许DCG解决方案在积极的情况下(“雷达”)通常更快,它不必构建整个反向列表,而是直接移动到中间,然后在离开自己的递归过程中检查其余的列表。但DCG解的缺点是它具有不确定性。一些时间测量会告诉我们更多。

再见

附注:使用Jekejeke Prolog的新plugable调试器完成的端口统计:

http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_dev/10_docu/02_reference/04_examples/02_count.html

但其他Prolog系统也有类似的功能。有关详细信息,请参阅"Code Profiler“列:

http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations

票数 8
EN

Stack Overflow用户

发布于 2011-12-29 23:29:37

这听起来确实像是一个家庭作业问题,但我就是情不自禁:

代码语言:javascript
复制
palindrome(X) :- reverse(X,X).

从技术上讲,prolog functor不会“返回”任何东西。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8669685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档