List 回文(家庭作业)
我试图用列表编写一个Prolog程序。但是,我必须使用差异列表,输出应为: 列表的第i个元素与列表的第(n-i+1)个元素相同,n是列表的长度。例如,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
[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上有自己的标记
- 有广泛的影响
- 要快速启动,请阅读
在这个级别上,我们可以使用内置的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.