试图通过将两个Prolog关系定义为affix
和suffix
来创建它们,以便在给定列表上进一步定义它们,如
?- consult(relpro).
% relpro compiled 0.00 sec, 956 bytes
true.
?- affix([a,b,c],[a,b,c,e,f]).
true.
?- affix([a,b,c], [a,b,e,f]).
false.
?- suffix([e,f],[a,b,e,f]).
true.
?- suffix([a,b,c],[a,b,c,e,f]).
false.
寻找开始的建议。
Grammars(dcg)非常容易定义这样的关系:
... -->
[] | [_], ... .
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
affix(Xs, Zs) :-
phrase( ( seq(Xs), ... ), Zs).
suffix(Xs, Zs) :-
phrase( ( ..., seq(Xs) ), Zs).
通过这种方式,对称性变得更加明显。如果你不确定形式主义,只需阅读这本入门书。
此外,这些定义仅适用于列表。其他定义也适用于一些"意外"非列表,如:suffix(non_list, Zs).
只需使用广泛可用的谓词append/3
!
affix_of([E|Es], [E|Es]). % [E|Es] is affix of [E|Es]
affix_of([X|Xs], Es) :- append([_|_], [X|Xs], Es). % [X|Xs] is suffix of Es
affix_of([], _). % [] is affix of anything
affix_of([X|Xs], Es) :- append([X|Xs], [_|_], Es). % [X|Xs] is prefix of Es
使用SICStus Prolog 4.3.2的一些示例查询:
|?-词缀_of([a,b,c],[1,b,c,e,f])。%[a,b,c]是[a,bc,d,e]的词缀吗?是%是!它是一个前缀。|?-词缀_of([a,b,c],[a,be,f])。%[a,b,c]是[a,be,f]的词缀吗?no%否!既不是前缀也不是后缀。|?-词缀_of(词缀,[a,b,c,d])。%[a,b,c,d]的词缀是什么?词缀=[a,b,c,d];词缀=[b,c,d];词缀=[c,d];词缀=[d];词缀=[];词缀=[a];词缀=[a,b];词缀=[a,b,c];不