2011-01-18 14 views
5

Bir "++ ++" operatörünü "a ++> b" yazarak [a, b] 'nin bir listesini oluşturacak şekilde tanımlamak istiyorum.Liste yapmak için prologda bir operatör nasıl tanımlanır?

Aşağıdaki kodu yazdım, ancak işi yapmıyor gibi görünüyor. operatörler açısından sadece eş yani

++>(X,Y) :- 
[X,Y]. 

:- op(500,xfy,++>). 
+2

gerçekten iki konunun, bir infix gösterimde olarak "++>" operatörünü tanımlayan, burada vardır ve "a ++> b" ifadesinin, [a, b] terimiyle "değerlendirileceği" düzenlenmesi. İlk bölüm, ** op/3 ** 'den bahsettiğiniz gibi oldukça standart Prolog'dur. Yeni operatörü ilgilendiren şartları "değerlendirmek" için makinelerin kullanılması zorlaşır. Aritmetik işlevler için SWI-Prolog'un, **/2 ** 'nin kullanıcı tanımlı işlevlerle çalışmasına izin veren bir yönergesi vardır, ancak sizinki bir aritmetik işlev değildir. Yeni bir yüklemi nasıl tanımlayacağınızı gösterebilirim ** iz/2 ** "değerlendir" ++. – hardmath

+0

SWI-Prolog'un 'arithmetic_function/1' yönergesini kazmak için vesile vesilesiyle karşılaştım ve [göz ardı edilmiş, belki de düştü] (http://www.swi-prolog.org/pldoc/man?predicate= arithmetic_function/1). – hardmath

cevap

0
:- op(500,xfy,++>). 
++>(X,Y,[X,Y]). 

Ve Aslında Prolog odaklı değil hesaplamalar

?- ++>(1,2,X). 
X = [1, 2]. 

gibi kullanırız. Bir elemanın diğerinin listesi olduğu bir terim \ 3 istersiniz. Yani, bu durumda 2 yerleştirilen operatör kullanamazsınız. Btw, bu durumda kullanamazsınız, bu durumda yalnızca aritmetik durumlarda kullanılır, bu durumda.

+1

Örneğinizde bir operatörün bildirilmesinde hiçbir fayda yoktur. 2 argüman operatörü (++>/2) ilan ettiniz ama 3 argüman yüklemi tanımladıysanız (++>/3) – gusbro

+1

Doğru, o zaman 3ncü operatöre bildirelim. –

0

sizin için bu çalışır mı:

++>((X,Y),Z) :-Z= [X,Y]. 

:- op(500,xfy,++>). 
0

[a,b,c]'.'(a,'.'(b,'.'(c)))) için sadece sözdizimsel şeker olduğunu. Yani sadece aynı operatörünüze tanımlamak ve bir dönüşüm yüklemi yazabilirsiniz:

:- op(500,xfy,'++>'). 

convert('++>'(A,B),[A|R]) :- 
    convert(B,R). 
convert(Any,[Any]). 

Örnek:

| ?- X = 1++>2++>3, convert(X,Y).          
X = 1++>2++>3 
Y = [1,2,3] ? 
yes 
İlgili konular