2016-03-30 14 views
-2

ayrıca böyle, verilen listeleri onları tanımlamak amacıyla affix ve suffix olarak tanımlayarak iki Prolog ilişkileri oluşturmak için çalışılıyor:İki ilişkiler ve tek Prolog programında bunların tanımları

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

Öneri aranıyor!

cevap

1

Sadece mevcut olan yüklemeyi kullanın append/3! SICStus Prolog 4.3.2 kullanarak

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 

bazı örnek sorgu

:

 
| ?- 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. İlk başta bunu anlamadım ... Bu 'sonek_of/2' değil, 'affix_of/2' olarak adlandırmak daha iyidir. Suffix_of (Xs, Es) olarak tanımlanabilir: - (_, Xs, Es). – repeat

+0

@Aspersum. Affix_of/2' için cevabımın eski bir versiyonunu görmek ister misiniz? Http://stackoverflow.com/posts/36354206/revisions ... – repeat

+0

@Aspersum adresine gidin. Anlıyorum. 'prefix_of (Önek, Liste): - (Önek, _, Liste) .' ve' suffix_of (Sonek, Liste) 'yi ekleyin: - (_, Sonek, Liste) ekleyiniz.' size uygun olmalıdır ... Örnek sorular ve cevaplar : '? - prefix_of (Xs, [a, b, c, d]).' Xs = [] verir; Xs = [a]; Xs = [a, b]; Xs = [a, b, c]; Xs = [a, b, c, d]; false.' ve '? - suffix_of (Xs, [a, b, c, d]).' Xs = [a, b, c, d] verir; Xs = [b, c, d]; Xs = [c, d]; Xs = [d]; Xs = []; false.' – repeat

2

Gramerleri () bu ilişkileri belirlemek için çok uygun olan: Bu şekilde

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

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

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

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

, simetri olur çok daha görünür. Eğer formalizmden emin değilseniz, sadece bu primer'u okuyun.

Ayrıca, bu tanımlamalar yalnızca listeler için geçerlidir. Diğer tanımlamalar, bazı "yanlışlıkla" olmayanlar için de geçerlidir: suffix(non_list, Zs).