尝试通过将它们定义为affix
和suffix
来创建两个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.
寻找入门建议。
答案 0 :(得分:2)
语法(dcg)非常容易定义这种关系:
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