4

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

列表的第 i元素与列表的第 (n-i+1)元素相同,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).

但是,我无法完成。请帮我!

4

1 回答 1

6

使用明确的从句语法!

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

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

true.
于 2015-07-01T20:32:04.083 回答