2016-03-30 4 views
-2

Der Versuch, zwei Prolog Beziehungen zu schaffen, indem sie als affix und suffix, um weiter definieren sie auf den gegebenen Listen, wie diese zu definieren:Zwei Beziehungen und ihre Definitionen in einem Prolog-Programm

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

für Anregungen der Suche!

Antwort

1

Verwenden Sie einfach das weit verbreitete Prädikat 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 

Einige Beispielabfragen SICStus Prolog mit 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 
+0

@Aspersum. Zuerst habe ich das nicht verstanden ... Es ist besser, das 'suffix_of/2' zu nennen, nicht' affix_of/2'. Es könnte als 'suffix_of (Xs, Es) definiert werden: - append (_, Xs, Es). – repeat

+0

@ Aspersum. Willst du eine ältere Version meiner Antwort für 'Affix_of/2' sehen? Gehen Sie zu http://stackoverflow.com/posts/36354206/revisions ... – repeat

+0

@ Aspersum. Aha. 'prefix_of (Präfix, Liste): - append (Präfix, _, Liste) .' und' suffix_of (Suffix, Liste): - append (_, Suffix, Liste) .' sollte Ihnen recht entsprechen ... Beispielabfragen und Antworten : '? - Präfix_von (Xs, [a, b, c, d]).' gibt 'Xs = []; Xs = [a]; Xs = [a, b]; Xs = [a, b, c]; Xs = [a, b, c, d]; false.' und '? - suffix_of (Xs, [a, b, c, d]).' gibt 'Xs = [a, b, c, d]; Xs = [b, c, d]; Xs = [c, d]; Xs = [d]; Xs = []; falsch. – repeat

2

Grammatiken () sind sehr geeignet solche Beziehungen zu definieren:

... --> 
    [] | [_], ... . 

seq([]) --> []. 
seq([E|Es]) --> [E], seq(Es). 

affix(Xs, Zs) :- 
    phrase((seq(Xs), ...), Zs). 

suffix(Xs, Zs) :- 
    phrase((..., seq(Xs)), Zs). 

Auf diese Weise wird die Symmetrie wird viel sichtbarer. Wenn Sie sich über den Formalismus nicht sicher sind, lesen Sie diese primer.

Weitere diese Definitionen gelten nur für Listen. Andere Definitionen gelten auch für einige "zufällige" Nicht-Listen, wie zum Beispiel: suffix(non_list, Zs).

Verwandte Themen