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

时间:2016-03-30 22:03:42

标签: list prolog

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

?- 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.

寻找入门建议。

2 个答案:

答案 0 :(得分:2)

语法()非常容易定义这种关系:

suffix(non_list, Zs).

以这种方式,对称性变得更加明显。如果您不确定形式主义,请阅读primer

此外,这些定义仅适用于列表。其他定义也适用于某些“偶然”非列表,例如:<%= javascript_include_tag "my_js" %> <%# foo function is defined here %> <div> <%# stuff %> </div> <script> var ready; ready = function() { foo(); } $(document).ready(ready); $(document).on('page:load', ready); </script>

答案 1 :(得分:1)

只需使用广泛使用的谓词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的一些示例查询:

| ?- affix_of([a,b,c], [a,b,c,e,f]).  % Is [a,b,c] an affix of [a,b,c,d,e]?
yes                                   % Yes! It is a prefix.

| ?- affix_of([a,b,c], [a,b,e,f]).    % Is [a,b,c] an affix of [a,b,e,f]?
no                                    % No! Neither prefix nor suffix.

| ?- affix_of(Affix, [a,b,c,d]).      % What are the affixes of [a,b,c,d]?
Affix = [a,b,c,d] ? ;
Affix = [b,c,d] ? ;
Affix = [c,d] ? ;
Affix = [d] ? ;
Affix = [] ? ;
Affix = [a] ? ;
Affix = [a,b] ? ;
Affix = [a,b,c] ? ;
no