2016-03-03 23 views
7

, sık sık bu gibi tekrarlayan koşullu ifadeler yazmak, ama onlar daha özlü yazılabilir isterdim:Anahtarı ifadeleri Prolog yüklemler ise

output(Lang, Type, Output) :- 
    (Lang = javascript -> 
     Output = ["function", Type]; 
    Lang = ruby -> 
     Output = ["def", Type]; 
    Lang = java -> 
     Output = [Type]). 

onunla koşullu tabloların bu diziyi değiştirmek mümkün olabilir mi daha özlü bir anahtar beyanı?

+1

Koşulların etrafında yazdığınız parantezler gereksizdir. Bunun yerine, bütün (a-> b; c-> d; e) yapının etrafına bir çift parantez yerleştirmelisiniz. Bu, diğer hedeflerle koşulu birleştirmek istediğinizde sürprizlerden kaçınmak için en iyi uygulamadır. – jschimpf

+0

@jschimpf Sorunu çözdüm, bu yüzden şimdi daha özlü görünüyor. –

cevap

6

. Birçok Prolog tarafından desteklenen

Örneğin, bir anahtar

switch(X, [Val:Goal|Cases]) :- 
    (X=Val -> 
     call(Goal) 
    ; 
     switch(X, Cases) 
    ). 

, bu daha sonra derleme zamanı dönüşümü ile daha verimli hale getirilebilir Gerekirse tanımlayarak

switch(X, [ 
    a : writeln(case1), 
    b : writeln(case2), 
    c : writeln(case3) 
]) 

gibi inşa uygulamak sistemleri (ECLiPSe'de inline/2 veya diğer bazı sistemlerde hedef genişletme).

Ve operatör bildirimleri aracılığıyla sözdizimini istediğiniz hoşunuza ayarlayabilirsiniz.

1

biraz daha kısa:

output(Lang, Type, Output) :- 
    (Lang, Output) = (javascript, ["function", Type]) ; 
    (Lang, Output) = (ruby, ["def", Type]) ; 
    (Lang, Output) = (java, [Type]). 

deyimsel: Birden hükümler bu kullanım şeklini yapılmış ve ayrıca oldukça özlü gibi görünüyor

output(Lang, Type, Output) :- 
    memberchk(Lang-Output, [ 
    javascript - ["function", Type], 
    ruby - ["def", Type], 
    java - [Type] 
    ]). 
+2

memberchk/2 kullanımı yapı kopyalamasında oldukça etkisiz bir yöntemdir (tüm AFAIK olan ve şu anda aktif olarak sürdürülen uygulamalar), yapının ilkini yığına kopyalar, daha sonra memberchk/2'yi çalıştırır ve son olarak kopyalanan yapının hatırlatılmasını sağlar. GC. Birincisi daha kabul edilebilir, ama sonraki answe olarak ayrı cümleler kullanmak gerçek Prolog yolu: yan tümce endeksleme nedeniyle hızlı ve hızlı. –

+0

@JanWielemaker: Katılıyorum, cevabım iyi değil ... Ayrıca, ilk snippet'im OP 'koduna eşdeğer değil. ama ayrı cümleler, kesintiler olmaksızın ... – CapelliC

6

.

o meta-yüklemler'ıN (argümanlar olarak hedef veya yüklemler'ıN almak yüklemler) kullanarak kendi kontrol yapılarını tanımlamak oldukça kolaydır Prolog'da
output(javascript, Type, ["javascript", Type]). 
output(ruby, Type, ["def", Type]). 
output(java, Type, [Type]). 
+0

Elbette, yalnızca az sayıda argüman varsa, bu sadece kısa olacak. Prolog'da anahtar deyimlerini uygulamak için daha kısa bir yol aramaya devam ediyorum. –

+0

Elbette, bu kullanım durumu için çok sayıda madde yapılmıyor. Bunlar, Prolog'da bulunan ana ** kontrol akış aracıdır. Bu haliyle, bu banal kullanım durumunu kapsamaktadır. – CapelliC