使用明确的从句语法!
DCG 是Prolog 的主要功能,它使使用差异列表变得容易——使您能够轻松编写简洁高效的代码!
想知道更多?只需按照点:
废话不多说,上代码:
回文-> []。
回文-> [_]。
回文 --> [X],回文,[X]。
%或者,我们还可以使用以下更紧凑的定义:
回文 --> [] | [_] | [X],回文,[X]。
完毕。让我们运行几个查询!首先,OP给出的查询:
?- phrase(palindrome, [a,X,c,b,Y]).
X = b, Y = a
; false.
在德语中,“玉米”被称为“mais”。如果我们把“siam”(“泰王国”的旧称)放在前面,我们会得到一个美味的回文:
?- set_prolog_flag(double_quotes, chars)。
真的。
?- 短语(回文,“sia mm ais”)。
真的
; 错误的。
?- 短语(回文,“sia m ais”)。% 或踢一个中间的 ' m ' 字符
true % ... 对于奇数长度的回文
; 错误的。
最后,我们不要忘记最通用的查询:
?- phrase(palindrome, Xs).
Xs = []
; Xs = [_A]
; Xs = [_A,_A]
; Xs = [_A,_B,_A]
; Xs = [_A,_B,_B,_A]
; Xs = [_A,_B,_C,_B,_A]
...
在prolog 顶层,我们可以使用内置的 Prolog 谓词listing/1
来查看 DCG 被“翻译”到的代码——在这个级别,差异列表的内部使用变得明显:
?- listing(palindrome//0).
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
palindrome(A, B),
B = [C|D].
true.