我在理解差异列表方面遇到了困难,特别是在这个谓词中:
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
palindrome(A, B),
B=[C|D].
有人能帮我理解正在发生的事情吗?
我在理解差异列表方面遇到了困难,特别是在这个谓词中:
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
palindrome(A, B),
B=[C|D].
有人能帮我理解正在发生的事情吗?
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
palindrome(A, B),
B=[C|D].
A
到 A
的列表(即空列表)是一个回文。第二个子句表示一个元素的列表是一个回文,无论这个元素是什么。[1,2,3]
,是其起始和结束之间的差异;一个普通列表的结尾总是一个空列表 []
。也就是说,对于列表 [1,2,3]
,我们应该把这个谓词称为 palindrome([1,2,3], [])
— 即检查差分列表 [1,2,3] - []
是否是回文。A - Z
,其中 A = [1,2,3|Z]
且 Z = []
。实际上,[1,2,3|[]]
和 [1,2,3]
是相同的。但是当 Z
还没有被实例化时,列表 A
仍然是开放式的 —— 它的“结尾指针” Z
可以被实例化为任何东西(当然,一旦回溯就不能再次实例化)。Z
实例化为一个开放式列表,比如 Z = [4|W]
,那么我们将得到一个新的扩展差分列表 A - W
,其中 A = [1,2,3,4|W]
。旧的差分列表仍然表示一个开放式列表的前缀 [1,2,3]
,即 A - Z = [1,2,3,4|W] - [4|W]
。一旦关闭,例如使用 W = [5]
,所有对数变量的配对仍然表示它们相应的差分列表(即 A - Z
,A - W
...),但是 A
不再是开放式的,因此不能再扩展了。-
函数,而是将差分列表定义的两个部分作为谓词的两个单独参数。当我们始终将它们视为一对并将其视为一对时,它们在概念上形成一对。这是同样的事情。
继续。第三个条款表示,要使 [C|A]-D
成为回文,A-B
必须是回文,并且 B
必须是 [C|D]
。其中A、D、B
是列表,C
是列表的一个元素。这可能会让人感到困惑;让我们使用 V
代替。此外,使用 Z
和 Y
代替 D
和 B
,以提醒我们“列表的结尾”:
palindrome([V|A], Z):- palindrome(A, Y), Y=[V|Z].
V ................. V ----
^ ^ ^
| | |
| | Z
A Y = [V|Z]
实际上,当 ......
核心是回文时,在其周围放置两个 V
可以得到另一个回文。
?- phrase(n,[a],[b]).
中,你的 "endpointer" 指向哪里,其中 n, [b] --> [a]
? - falsephrase/2
进行调用。您的解释基于一个非常特定的属性,而并非每个DCG或差异列表都具有该属性;因此不能解释它们的本质。并且:我不同意您的说法,即[a]-[b]不是差异列表。毕竟,在DCG中会出现这样的差异,并且DCG使用差异列表。 - falsepalindrome([a],[b])
会失败,我认为这没有问题。当然,我可能是错的,如果有人能向我展示在哪里以及为什么,我将不胜感激。 - Will Ness[b]-[a]
视为差异列表对我来说是新的。 :) [b,a]-[a]
我可以理解,但不是这个。 - Will Ness% List is a palindrome if List - [] is a palindrome:
palindrome( List ) :- palindrome(List, []).
% The empty list (L-L) is a palindrome:
palindrome(L, L).
% A singleton list, ([X|L] - L), is a palindrome:
palindrome([X|L], L).
palindrome( [E|Xs], Tail ) :- palindrome(Xs, [E|Tail]).
?- palindrome( X ).
X = [] ;
X = [_G1247] ;
X = [_G1247, _G1247] ;
X = [_G1247, _G1253, _G1247] ;
X = [_G1247, _G1253, _G1253, _G1247]
....
A
不是可以和任何东西统一吗,而不仅仅是空列表吗?这不是一个普遍的身份关系吗? - Shonpalindrom(A,[])
。 - false