【发布时间】:2017-02-22 07:07:53
【问题描述】:
前缀/后缀的 Prolog 表示法非常简单: 它几乎把所有的工作都放在了追加上。 对于那些不知道的人:
prefix(P,L):-append(P,_,L).
suffix(S,L):-append(_,S,L).
现在这意味着,prefix(X,[a,b,c,d]). 的结果
将是:X=[];X=[a];X=[a,b];X=[a,b,c];X=[a,b,c,d]
这是我的问题:我想要一个“真正的”前缀。因此,前缀不能为空,其后面的部分也不能为空。
所以查询prefix(X,[a,b,c,d]).的结果应该是
X=[a];X=[a,b];X=[a,b,c]
就是这样。
不幸的是,标准内置前缀谓词的真正优势在于,它可以使用 append 的终止,即append([],Y,Y).
所以很容易知道什么时候停止,一个一个地挑选列表直到列表为空。
我的终止意味着:如果列表中只剩下一个元素,则停止。 我该怎么做?
我的天真结果是:
prefix(P,L):-
length(P,1),append(P,E,L),E/=[].
这感觉不对。我在工作,所以我没有检查这是否真的有效,但它应该:
有没有更方便的方法来做到这一点? 后缀也是如此,这会更难,因为你没有办法像头一样具体地处理尾巴,我想我只是把整个事情颠倒过来,然后在上面调用前缀。
中缀只是两个的组合。
我希望我的意思很清楚。感谢您的输入! tl;dr: 如何写一个谓词 prefix/2 只过滤真实前缀,所以前缀本身不能为空,后面的列表也不能为空。
【问题讨论】:
标签: list recursion prolog append prefix