2012-04-05 13 views
27

मैं ली नाइश के पेपर Higher-order logic programming in Prolog में प्रोलॉग वाक्यविन्यास के एक अपरिचित बिट में आया हूं। यहाँ कागज से पहले कोड नमूना है:प्रोलॉग - सूचियों के लिए असामान्य विपक्ष वाक्यविन्यास

% insertion sort (simple version) 
isort([], []). 
isort(A.As, Bs) :- 
    isort(As, Bs1), 
    isort(A, Bs1, Bs). 

% insert number into sorted list 
insert(N, [], [N]). 
insert(N, H.L, N.H.L) :- 
    N =< H. 
insert(N, H.LO, H.L) :- 
    N > H, 
    insert(N, LO, L). 

मेरे भ्रम isort(A.As, Bs) :- में A.As के साथ है। संदर्भ से, सूचियों के लिए एक वैकल्पिक विपक्ष वाक्यविन्यास होने के लिए प्रतीत होता है, isort([A|As], Bs) :- के बराबर।

साथ ही N.H.L[N|[H|L]] कहने का एक और सुविधाजनक तरीका प्रतीत होता है।

लेकिन एसडब्ल्यूआई प्रोलॉग इस असामान्य वाक्यविन्यास को स्वीकार नहीं करेगा (जब तक कि मैं कुछ गलत नहीं कर रहा हूं)।

क्या कोई इसे पहचानता है? क्या मेरी परिकल्पना सही है? कौन सा प्रोलॉग दुभाषिया स्वीकार करता है कि वैध वाक्यविन्यास के रूप में?

+0

कागज में कौन सा प्रोलॉग उपयोग किया जाता है? –

+0

मैंने उस के लिए पेपर स्कैन किया लेकिन दुर्भाग्य से वहां इसका संदर्भ नहीं मिला! –

+0

यह कुछ वाक्य रचनात्मक चीनी हो सकता है –

उत्तर

33

डॉट ऑपरेटर 1972 के पहले ही Prolog प्रणाली में सूचियों के लिए इस्तेमाल किया गया था , अल्गोल-डब्ल्यू में लिखा गया है, जिसे कभी-कभी प्रोलॉग 0 कहा जाता है। यह LISP सिस्टम में समान नोटेशन से प्रेरित है। निम्नलिखित उदाहरण पेपर The birth of Prolog से एलन कॉलमेरौयर और फिलिप रूससेल – प्रोलॉग के बहुत रचनाकारों से है।

+ELEMENT(*X, *X.*Y). 
+ELEMENT(*X, *Y.*Z) -ELEMENT(*X, *Z). 

उस समय, []NIL हुआ करता था।

बट्टानी & मेलोनी द्वारा फोरट्रान में लिखा गया अगला प्रोलॉग संस्करण, परमाणुओं और चरों को अलग करने के लिए मामलों का उपयोग करता है।फिर डीईसीसिस्टम 10 प्रोलॉग ने nil और X.Xs[] और [X,..Xs] के साथ स्क्वायर ब्रैकेट नोटेशन की शुरुआत की जो डीईसी सिस्टम 10 के बाद के संस्करणों में [X|Xs] को वैकल्पिक विकल्प के रूप में प्राप्त किया गया। आईएसओ प्रोलॉग में, केवल [X|Xs], .(X,Xs), और कैनोलिक सिंटैक्स '.'(X,Xs) है।

कृपया ध्यान दें कि आईएसओ प्रोलॉग में डॉट के कई अलग-अलग नियम हैं। जब अंतरिक्ष, NEWLINE, टैब की तरह एक % या एक लेआउट चरित्र के बाद यह रूप में

  • अंत टोकन पहले से ही कार्य करता है।

  • एक चल बिन्दु संख्या में दशमलव बिंदु, 3.14159

  • ग्राफिक टोकन चार रूप =..

तो ग्राफिक टोकन बनाने यदि आप अब एक इन्फ़िक्स ऑपरेटर के रूप में . की घोषणा कर रहे हैं की तरह , आपको बहुत सावधान रहना होगा। जो कुछ आप लिखते हैं और प्रोलॉग सिस्टम क्या पढ़ेंगे। एक अतिरिक्त अतिरिक्त स्थान किसी शब्द का अर्थ बदल सकता है। दोनों अंकन में संख्या की दो सूचियां पर विचार करें:

[1,2.3,4]. [5]. 
1 .2.3.4.[]. 5.[]. 

कृपया ध्यान दें कि 1 बाद में एक रिक्ति जोड़ने के लिए है। इस संदर्भ में, किसी संख्या के सामने एक अतिरिक्त सफेद स्थान आपकी शर्तों का अर्थ बदल सकता है। इसलिए जैसा:

[1,-2]. 
1.(-2).[]. 

ऋणात्मक संख्याओं को डॉट सूचियों के भीतर दौर कोष्ठक की आवश्यकता होती है:

[1|2.3]. [4]. 5. []. 
1 .2.3. 4.[]. 5. []. 

यहाँ एक और उदाहरण है जो और भी अधिक ठोस हो सकता है।

आज, केवल वाईएपी और एक्सएसबी शेष है जो अभी भी डिफ़ॉल्ट रूप से – और they do it differently द्वारा इन्फिक्स . प्रदान करता है। और एक्सएसबी उपरोक्त डॉट सिंटैक्स को भी पहचान नहीं लेता है: आपको कुछ गैर-संख्यात्मक संख्याओं के चारों ओर गोल ब्रैकेट की आवश्यकता होती है।

आपने लिखा है कि N.H.L[N|[H|L]] कहने का एक और सुविधाजनक तरीका प्रतीत होता है। आईएसओ प्रोलॉग में ऐसे अभिव्यक्तियों को सरल बनाने के लिए एक सरल नियम-अंगूठा है: जब भी आप एक सूची के भीतर टोकन | और [ एक दूसरे के तुरंत बाद देखते हैं, तो आप उन्हें , द्वारा प्रतिस्थापित कर सकते हैं (और दाईं तरफ संबंधित ] हटा सकते हैं) । तो अब आप लिख सकते हैं: [N,H|L] जो नहीं देखता है खराब।

आप उस नियम का भी दूसरी दिशा में उपयोग कर सकते हैं। अगर हमारे पास [1,2,3,4,5] सूची है तो हम | का उपयोग "रेज़र ब्लेड" के रूप में कर सकते हैं: [1,2,3|[4,5]]


एक और टिप्पणी, जब से तुम Naish पेपर पढ़ रहे हैं: इस बीच, यह well understood है कि केवल call/N की जरूरत है! और आईएसओ प्रोलॉग call/1, call/2call/8 तक का समर्थन करता है।

+4

वाह, क्या एक अच्छा जवाब है, बहुत बहुत धन्यवाद! '[एन, एच | एल] 'वास्तव में बहुत अच्छा है, मुझे नहीं पता था कि यह वैध था। मैं उस एक्सचेंज के सूचक की भी सराहना करता हूं, यह वास्तव में दिलचस्प है। –

+4

आपको यह देखने में दिलचस्पी हो सकती है कि कैसे 'कॉल/एन'] के साथ लैम्बडा फिट है (http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord)। – false

+3

मैंने अभी जांच की है और बिंदीदार जोड़ी लिस्पी पर मक्कार्थी के पहले पेपर में दिखाई देती है - http://www.cs.unm.edu/~luger/cs451/resources/recursive.pdf (सेक्शन 3) –

9

यह वाक्यविन्यास एनयू-प्रोलॉग से आता है। here देखें। यह शायद सिर्फ सामान्य सूची functor है/2 एक अनुगामी खाली सूची के लिए एक इन्फ़िक्स ऑपरेटर के रूप में नए सिरे से परिभाषित, आवश्यकता के बिना '।':

?- L= .(a,.(b,[])). 
L = [a,b] 
Yes (0.00s cpu) 
?- op(500, xfy, '.'). 
Yes (0.00s cpu) 
?- L = a.b.[]. 
L = [a,b] 
Yes (0.00s cpu) 
+4

वाक्यविन्यास बहुत पुराना है कि एनयू (1 9 87) या एमयू। – false

+0

@false: मुझे उत्सुक बनाता है। क्या आप आसानी से उपलब्ध किसी भी संदर्भ को इंगित कर सकते हैं? मैंने इसे कभी भी इंफिक्स ऑपरेटर के रूप में कभी भी नहीं देखा है। उदाहरण के लिए, सी एंड एम में इसे देखकर याद नहीं किया जा सकता है। – twinterer

+0

मैंने अपने उत्तर के लिए सबसे महत्वपूर्ण संदर्भ जोड़ा। – false

10

हाँ, तुम ठीक कह रहे, डॉट यह सूची है विपक्ष इन्फ़िक्स ऑपरेटर । यह वास्तव में आईएसओ प्रोलॉग मानक द्वारा आवश्यक है, लेकिन आमतौर पर छुपाया जाता है। मैंने पाया (और प्रयुक्त) कुछ समय पहले वाक्यविन्यास:

:- module(eog, []). 
:- op(103, xfy, (.)). 

% where $ARGS appears as argument, replace the call ($ARGS) with a VAR 
% the calle goes before caller, binding the VAR (added as last ARG) 
funcs(X, (V, Y)) :- 
    nonvar(X), 
    X =.. W.As, 

    % identify meta arguments 
    ( predicate_property(X, meta_predicate M) 
     % explicitly exclude to handle test(dcg) 
     % I'd like to handle this case in general way... 
    , M \= phrase(2, ?, ?) 
    -> M =.. W.Ms 
    ; true 
    ), 

    seek_call(As, Ms, Bs, V), 
    Y =.. W.Bs. 

% look for first $ usage 
seek_call([], [], _Bs, _V) :- 
    !, fail. 
seek_call(A.As, M.Ms, A.Bs, V) :- 
    M @>= 0, M @=< 9, % skip meta arguments 
    !, seek_call(As, Ms, Bs, V). 
seek_call(A.As, _, B.As, V) :- 
    nonvar(A), 
    A = $(F), 
    F =.. Fp.FAs, 
    ( current_arithmetic_function(F) % inline arith 
    -> V = (PH is F) 
    ; append(FAs, [PH], FBs), 
     V =.. Fp.FBs 
    ), 
    !, B = PH. 
seek_call(A.As, _.Ms, B.As, V) :- 
    nonvar(A), 
    A =.. F.FAs, 
    seek_call(FAs, Ms, FBs, V), 
    !, B =.. F.FBs. 
seek_call(A.As, _.Ms, A.Bs, V) :- 
    !, seek_call(As, Ms, Bs, V). 

:- multifile user:goal_expansion/2. 
user:goal_expansion(X, Y) :- 
    (X = (_ , _) ; X = (_ ; _) ; X = (_ -> _)) 
    -> !, fail % leave control flow unchanged (useless after the meta... handling?) 
    ; funcs(X, Y). 

/* end eog.pl */ 

मुझे इसके खिलाफ सलाह दी गई थी। प्रभावी रूप से, [ए | बी] वाक्यविन्यास यह एक विकास है। ऑपरेटर, पठनीयता के लिए पेश किया।

ओटी: वह कोड क्या है?

उपरोक्त कोड प्रोजेन के साथ प्रोजेन को मीठा करने का मेरा प्रयास है। अर्थात्, अनुरोध पर परिचय $ के माध्यम से, गणित के लिए आवश्यक (उदाहरण के लिए) अस्थायी चर भाव

fact(N, F) :- 
    N > 1 -> F is N * $fact($(N - 1)) ; F is 1. 

प्रत्येक $ एक चर परिचय। विस्तार के बाद, हम एक और अधिक परंपरागत तथ्य/2

?- listing(fact). 
plunit_eog:fact(A, C) :- 
    ( A>1 
    -> B is A+ -1, 
     fact(B, D), 
     C is A*D 
    ; C is 1 
    ). 

कहाँ हम कई भाव है, जो उपयोगी हो सकता है ...

+0

उत्तर के लिए बहुत बहुत धन्यवाद! मुझे समझ में नहीं आता कि '$' कैसे काम कर रहा है, लेकिन यह '$ तथ्य' के साथ उदाहरण में बहुत ही आकर्षक है - मुझे इस कोड को जानने में कुछ समय बिताना होगा। –

+0

उस कोड का परीक्षण करने के लिए आपके प्रोलॉग को target_expansion/2 और मॉड्यूल प्रदान करना होगा। दोनों डी-फैक्टो एक्सटेंशन हैं, आईएसओ अनुमोदित नहीं है। उसके लिए खेद है। असल में, आईएसओ प्रोलॉग यह एक बहुत ही सीमित भाषा डब्लूआरटी उपलब्ध कार्यान्वयन है, यह प्रमुख प्रोलॉग समस्याओं में से एक है ... – CapelliC

+2

@chac: सिस्टम अभी भी 'target_expansion/2'' के अर्थ को बदलते हैं और रिलीज़-टू-रिलीज की तरह आधार। यह मानकीकृत करने के लिए व्यावहारिक रूप से असंभव है। – false

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