2015-11-30 22 views
5

मान लें कि मेरे पास निम्न संदर्भ मुक्त व्याकरण था।प्रोलॉग में संदर्भ व्याकरण मुक्त व्याकरण

S -> A 
A -> mAn 
A -> o 

यह प्रोलॉग में कैसा लगेगा? मैंने यही कोशिश की लेकिन यह काम नहीं करता है। दूसरी पंक्ति मुद्दा है।

S(Z) :- A(Z). 
A(Z) :- append([m],X,Z2), A(X), append(Z2,[n],Z). 
A([o]). 
+0

'ए (जेड)', लेकिन 'ए (जेड) 'न लिखें। इसी प्रकार सभी predicate नामों के साथ ... – repeat

उत्तर

4

के बाद से व्याकरण पुनरावर्ती नहीं छोड़ा जाता है, हम उपयोग कर सकते हैं एक DCG:

s --> a. 
a --> [m], a, [n]. 
a --> [o]. 

तो हम पार्स या सभी को स्वीकार कर लिया दृश्यों उत्पन्न कर सकते हैं। उदाहरण के लिए, उत्पादन:

?- listing(s). 
s(A, B) :- 
    a(A, B). 

?- listing(a). 
a([m|A], C) :- 
    a(A, B), 
    B=[n|C]. 
a([o|A], A). 

कोई संलग्न/3 की आवश्यकता है, अंतर करने के लिए धन्यवाद सूचीबद्ध करता

संपादित का उपयोग कर संलग्न/3

s(Z) :- a(Z). 
a(Z) :- append([m|X],[n],Z), a(X). 
a([o]). 
:

?- length(L, _), phrase(s, L). 
L = [o] 
L = [m, o, n] 
L = [m, m, o, n, n] 
... 

Prolog कोड का निरीक्षण करने

एसडब्ल्यूआई-प्रोलॉग ने संलग्न किया है/2 (बस ऐप पर आधारित है अंत/3 ठीक से श्रृंखलित), कि अधिक पठनीय विकल्प

a(Z) :- append([[m],X,[n]], Z), a(X). 

वैसे भी देते हैं, हम एक/1 रिकर्सिवली के बाद सूची का निर्माण किया गया/विभाजित

+1

कूल। यह कैसे होगा अगर संलग्न/3 का उपयोग किया गया था? – snctmpst

+1

एस (एक्स)। डीसीजी फैब हैं! – repeat

+0

आप 'a ([o]) क्यों डालते हैं। 'आखिरी? – false

3

इस जवाब में कहते हैं, हम का उपयोग करना चाहिए आमतौर पर उपलब्ध अनुमान append/3

 
s(Xs) :- 
    a(Xs). 

a([o]). 
a([m|Xs]) :- 
    append (Xs0,[n],Xs), 
    a(Xs0). 

नमूना क्वेरी:

 
?- length (Xs,_), s(Xs). 
    Xs = [o] 
; Xs = [m,o,n] 
; Xs = [m,m,o,n,n] 
; Xs = [m,m,m,o,n,n,n] 
... 

नोट: के बजाय append/3 का उपयोग करना, एक बुरा विकल्प सामान्य रूप में, और दोनों निचले क्रम के प्रदर्शन और कोड पठनीयता के लिए योगदान कर सकते हैं। जब भी संभव हो, इसके बजाय का उपयोग करें!

संबंधित मुद्दे