我尝试使用列表编写Prolog程序。但是,我必须使用差异列表,输出应为:
列表的i th 元素与列表的(n-i + 1) th 元素相同,n是列表的长度。例如,[a,X,c,b,Y]
应该提供X = b
和Y = a
。我在其他问题中找不到类似的回文示例。
到目前为止,我已实施:
% length of the list
len([], 0).
len([H|T], B) :-
len(T, NT),
B is NT + 1.
% return the ith element of the list
match([H|_], 0, H) :-
!.
match([_|T], N, H) :-
N > 0,
N1 is N-1,
match(T, N1, H).
然而,我无法完成。请帮帮我!
答案 0 :(得分:5)
使用明确的句子语法!
DCG,一个主要的Prolog功能,使得使用差异列表变得容易 - 使您能够轻松编写简洁的和高效代码!
想知道更多?请按照以下几点:
如需快速入门,请阅读DCG primer by Markus Triska!
没有任何进一步的麻烦,让我们来看看代码:
palindrome --> []. palindrome --> [_]. palindrome --> [X], palindrome, [X]. % Alternatively, we could also use the following more compact definition: palindrome --> [] | [_] | [X], palindrome, [X].
完成。让我们运行一些查询!首先,OP给出的查询:
?- phrase(palindrome, [a,X,c,b,Y]).
X = b, Y = a
; false.
用德语,"玉米"被称为"mais"。如果我们将"siam"(#34;泰国王国的旧名称")放在前面,我们会得到一个美味的回文:
?- set_prolog_flag(double_quotes, chars). true. ?- phrase(palindrome, "siammais"). true ; false. ?- phrase(palindrome, "siamais"). % or kick one middle 'm' character true % ... for an odd-length palindrome ; false.
最后,让我们不要忘记最常见的查询:
?- 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-toplevel上,我们可以使用内置的Prolog谓词listing/1
来查看DCG所代码的代码"翻译"在这个级别,difference-lists的内部使用变得明显:
?- listing(palindrome//0).
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
palindrome(A, B),
B = [C|D].
true.