如何在Prolog中创建两个简单的关系



试图通过将两个Prolog关系定义为affixsuffix来创建它们,以便在给定列表上进一步定义它们,如

?- 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];不

最新更新