2015-11-06 60 views
3

我正在編寫一個prolog謂詞來打印給定值的可能更改, 運行時顯示X2是單變量變量。 X是給定的值,T是給出的可用面額列表和L是由此產生的列表。在序言中獲得單身警告(面額變更)

change(100,[1,2,5,10],L).

change(X,T,L) :- 
    change1(X,T,[],L). 
change1(X,[H|T],AC,L):- 
    X > 0, 
    X >= H, 
    X2 is X-1, 
    change1(X2,T,[H|AC],L); 
    change1(X2,[H|T],[H|AC],L); 
    change1(X,T,AC,L). 
change1(0,_,AC,AC). 
change1(X,[],_,_):-X \= 0,false. 

回答

2

你得到一個警告,因爲逗號,;更高的優先級,讓你的代碼的有效分組是:

change1(X,[H|T],AC,L):- 
    ( X > 0, 
     X >= H, 
     X2 is X-1, 
     change1(X2,T,[H|AC],L) 
    ) 
    ; change1(X2,[H|T],[H|AC],L) 
    ; change1(X,T,AC,L). 

(注意括號)將change1(X2,[H|T],[H|AC],L)與可能實例化01的任何查詢隔離。所以X2在這種情況下是單身人士。您可能的意思是:

change1(X,[H|T],AC,L):- 
    X > 0, 
    X >= H, 
    X2 is X-1, 
    ( change1(X2,T,[H|AC],L) 
    ; change1(X2,[H|T],[H|AC],L) 
    ; change1(X,T,AC,L) 
    ). 
2

使用

 
:- use_module ([ library(clpfd) , library(lists) ]). 
:- set_prolog_flag (toplevel_print_anon , false). 

我們定義change_/4這樣的:

 
change_(Total, Units, Amounts, Zs) :- 
    same_length (Units, Amounts), 
    Units ins 1..sup, 
    Amounts ins 0..sup, 
    scalar_product (Units, Amounts, #=, Total), 
    append ([Total|Units],Amounts, Zs). 

樣品查詢:

 
?- change_(100, [1,2,5,10], Amounts, _Zs), labeling ([], _Zs). 
    Amounts = [0,0,0,10] 
; Amounts = [0,0,2,9] 
; Amounts = [0,0,4,8] 
... 
+2

任何理由寫'clpfd;'? – false

+1

美麗。你如何將每個功能的所有鏈接指向Web文檔參考?我假設沒有手...涉及一些序言? :P –

+0

@DiegoSevilla。我用赤手空拳做到了:)建立正確的「automagic」確實在我的名單上。 OTOH我還在搞清楚我究竟想要什麼......說,一個*體面的*數量的鏈接是......現在,我認爲最好在我當前的每個謂詞中至多有*一個鏈接觀點:相信我在我看來有五個「(ins)/ 2」的目標。那麼只有第一個應該是一個鏈接,其他的更好。這樣一來,即使在縮小時,可見鏈接的數量也會更多......您對此的立場是什麼? – repeat