两个括号之间的字符列表加上一个数字

List of characters between two parenthesis plus a number

我正在尝试做一个谓词 parlist(list,num,all).

"list" 基本上是一个字符列表(例如 ['a','b','c']),"num" 只是一个自然数,而 "all" 是将列表加上数字连接起来的列表,除非元素的长度在原始列表为 2 个或更多,则输出列表 "all" 必须在两个括号之间,不包括数字。

长度 >=2 的列表示例:

parlist(['a','b','c'],3,R).

输出应该是:

R=['(','a','b','c',')',3]

长度 <2 的列表示例:

parlist(['a'],2,R).

输出应该是:

R=['a',2]

我对 prolog 有点迷茫,所以我不知道如何开始,请帮忙。 谢谢

很多Prolog都是模式匹配。你有三个案例,对吧?

  • 空列表
    只需将数字放入列表中即可:[ 3 ]

  • 长度为 1 的列表
    将数字附加到列表中:[ a , 3 ]

  • 长度大于 1 的列表
    将列表括在括号中并在末尾添加数字:[ '(', a, b, ')', 3 ].

为此,您甚至不需要遍历列表。您只需要在谓词子句的头部进行模式匹配。

情况一:空列表。这很简单:

parlist( [], N, [N] ).

情况 2:长度为 1 的列表。 这同样简单:

parlist( [X], N, [X,N] ).

情况 3:长度 > 1 的列表。 有点复杂。你可以在这里使用内置的,或者自己滚动。

内置:我们可以使用append/3来实现这里:

parlist( [X,Y|Zs], N, R ) :- append( ['(',X,Y|Zs], [')',N], R ).

自己动手:您几乎可以同样轻松地自己动手。我们将在这里使用一些专门的辅助谓词:

parlist( [X,Y|Zs], N, ['(' | R ] ) :- parlist1( ['(',X,Y|Zs], N, R ).

%--------------------------------------------------------------------
% If the list is of length >= 2, add the 1st two elements to the
% result list, and
% - recurse down on the tail.
%
% If the list is of length 0 or 1, we're done: close out the result with
% - the last element of the list (if present),
% - the lead-out parenthesis and
% - the number
%
%--------------------------------------------------------------------
parlist1( [X,Y|Zs] , N , [X,Y|R] ) :- parlist1( Zs , N , R ).
parlist1( []       , N , [  ')',N] ).
parlist1( [X]      , N , [X,')',N] ).