Prolog - Palindrome Functor

Amj*_*jad 5 prolog palindrome dcg

我试图palindrome/1在Prolog中编写一个谓词,当且仅当它的列表输入包含一个回文列表时才是真的.

例如:

?- palindrome([1,2,3,4,5,4,3,2,1]).
Run Code Online (Sandbox Code Playgroud)

是真的.

任何想法或解决方案?

gus*_*bro 8

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

palindrome(L):-
  reverse(L, L).
Run Code Online (Sandbox Code Playgroud)


Tra*_*ers 8

看起来每个人都投票支持基于反向/ 2的解决方案.我想你们有一个反向/ 2解决方案,它是给定列表的O(n).累加器的东西:

 reverse(X,Y) :- reverse(X,[],Y).

 reverse([],X,X).
 reverse([X|Y],Z,T) :- reverse(Y,[X|Z],T).
Run Code Online (Sandbox Code Playgroud)

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

 palin --> [].
 palin --> [_].
 palin --> [Border], palin, [Border].
Run Code Online (Sandbox Code Playgroud)

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

港口统计

因此,DCG解决方案通常在正面情况下("雷达")通常更快,它不必构建整个反向列表,而是直接移动到中间,然后在离开自己的递归期间检查其余部分.但DCG解决方案的缺点在于它是非确定性的.一些时间测量会告诉更多......

再见

PS:使用Jekejeke Prolog的新可插入调试器完成端口统计:http:
//www.jekejeke.ch/idatab/doclet/prod/en/docs/10_dev/10_docu/02_reference/04_examples/02_count.html

但其他Prolog系统也有类似的设施.有关详细信息,请参阅"代码分析器"列:http:
//en.wikipedia.org/wiki/Comparison_of_Prolog_implementations

  • 我不确定,但反向可能是原始的,因此计算CERF是不合适的.因为它听起来像是Prolog的新手,所以看起来只是意味着在他/她身上抛出一个全新的语法:).但是,这个主题很好. (3认同)

Sco*_*ter 5

这肯定听起来像是一个家庭作业问题,但我无法自拔:

palindrome(X) :- reverse(X,X).
Run Code Online (Sandbox Code Playgroud)

从技术上讲,prolog functor不会"返回"任何东西.