Waa*_*ten 4 prolog palindrome dcg difference-lists
我正在为Prolog(SWI)做作业,但无法弄清楚如何完成这项工作:
我有仿函数:
palindrome([]).
palindrome([_]).
palindrome([A|T]) :-
append(Middle,[A],T),
palindrome(Middle).
Run Code Online (Sandbox Code Playgroud)
它告诉给定的列表是否是回文.
对于我的作业,我必须编写一个palindrome/2没有append/3和有差异列表的仿函数.
我知道差异列表是一种形式[Y|X]-X,但我不明白如何使用它以及如何替换append仿函数.
有人可以向我解释一下吗?
对于长度为n的给定列表,您的解决方案需要一些O(n 2)推论:对于/ 1,n(实际上是n/2),对于每个只需搜索并比较结束的i.palindromeappend/3
重新定义您的定义的最直接的方法是使用语法(DCG),这是使用差异列表的便捷方式.请注意,每个语法规则对应于程序中的一个子句.
palindrome -->
[].
palindrome -->
[_].
palindrome -->
[A],
palindrome,
[A].
palindrome(T) :-
phrase(palindrome,T).
Run Code Online (Sandbox Code Playgroud)
为方便起见,这里写的语法更紧凑:
palindrome --> [] | [_] | [A], palindrome, [A].
Run Code Online (Sandbox Code Playgroud)
现在,这些语法规则是如何实现的?最简单的方法是查看实际定义listing(palindrome).
?- listing(palindrome).
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
palindrome(A, B),
B=[C|D].
Run Code Online (Sandbox Code Playgroud)
所以现在这是使用差异列表的定义.