List 回文(家庭作业)

List 回文(家庭作业),list,prolog,palindrome,dcg,difference-lists,prolog-toplevel,List,Prolog,Palindrome,Dcg,Difference Lists,Prolog Toplevel,我试图用列表编写一个Prolog程序。但是,我必须使用差异列表,输出应为: 列表的第i个元素与列表的第(n-i+1)个元素相同,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

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

列表的第i个元素与列表的第(n-i+1)个元素相同,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).
然而,我无法完成。请帮帮我

使用定分句语法

DCG是Prolog的一个主要特性,它使差异列表的使用变得简单,使您能够轻松地编写简洁高效的代码

想知道更多吗?只需遵循以下要点:

  • DCG在StackOverflow上有自己的标记
  • 有广泛的影响

  • 要快速启动,请阅读

不用再多说了,让我们来看看代码:

palindrome --> []. palindrome --> [_]. palindrome --> [X], palindrome, [X]. % Alternatively, we could also use the following more compact definition: palindrome --> [] | [_] | [X], palindrome, [X]. 在德语中,“玉米”被称为。如果我们把(古名“泰国王国”)放在前面,我们会得到一个美味的回文:

?- 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.
在这个级别上,我们可以使用内置的Prolog谓词
listing/1
来查看DCG被“翻译”为的代码,在这个级别上,内部使用变得很明显:

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

true.

Prolog已经有
length/2
,因此您不需要编写自己的列表长度谓词(
len/2
)。还有一个Prolog谓词返回列表的第n个元素(请参阅SWI Prolog的
nth0/3
nth1/3
)。另外,你描述的是回文。通过搜索“prolog-palindrome”,你可能会找到几个例子,可能是@mescalinum的重复,我不这么认为。我还搜索了其他关于回文的问题。你能帮帮我吗
?- phrase(palindrome, Xs).
   Xs = []
;  Xs = [_A]
;  Xs = [_A,_A]
;  Xs = [_A,_B,_A]
;  Xs = [_A,_B,_B,_A]
;  Xs = [_A,_B,_C,_B,_A]
...
?- listing(palindrome//0).
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
    palindrome(A, B),
    B = [C|D].

true.