回文(家庭作业)

时间:2015-06-30 08:20:41

标签: list prolog palindrome dcg difference-lists

我尝试使用列表编写Prolog程序。但是,我必须使用差异列表,输出应为:

列表的i th 元素与列表的(n-i + 1) th 元素相同,n是列表的长度。例如,[a,X,c,b,Y]应该提供X = bY = 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).

然而,我无法完成。请帮帮我!

1 个答案:

答案 0 :(得分:5)

使用明确的句子语法!

DCG,一个主要的Prolog功能,使得使用差异列表变得容易 - 使您能够轻松编写简洁的高效代码!

想知道更多?请按照以下几点:

没有任何进一步的麻烦,让我们来看看代码:

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谓词listing/1来查看DCG所代码的代码"翻译"在这个级别,的内部使用变得明显:

?- listing(palindrome//0).
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
    palindrome(A, B),
    B = [C|D].

true.