2011-03-02 51 views

回答

2

可能可以實現這樣的事情在C++語言擴展,但語言本身,這是不可能的。

唯一的內置類型的約束是有限域約束(非負整數),有限組約束(上組非負整數的域約束)和記錄的約束。

也許你可以使用整型常量來模擬你的問題,例如

declare 
    %% 4 constants 
    Lisa = 1 
    Ann = 2 
    Mary = 3 
    Joanna = 4 

    %% N will be the constrained variable 
    N 
in 
    N::[Lisa Ann Mary Joanna] 
    {Show N} %% displays N{1#4}, i.e. N is between 1 and 4 

    N \=: Mary %% tell: N is not Mary 
    {Show N} %% displays N{1 2 4}, i.e. N is one of 1,2,4 

如果您不想使用有限域,則有更一般的邏輯編程思想。您可以爲變量的不同可能值創建的選擇點,例如:

declare 

    proc {Script A} 
    A = 
    choice 
     lisa 
    [] ann 
    [] mary 
    [] joanna 
    end 
    end 

    {Show {SearchOne Script}} %% displays "[lisa]" 
    {Show {SearchAll Script}} %% displays "[lisa ann mary joanna]" 

也可以做到這一點有沒有靜態已知數量的值,使用Combinators

+0

感謝您的回答。非常豐富和有益的。我想堅持約束規劃範式,以便利用傳播者以及能夠將一般約束與一階邏輯規則混合。我想我會使用字典爲了在我的csp中使用我的常量作爲整數值。 – mhourdakis 2011-03-04 09:51:37