2012-01-05 105 views
0

好的。這是我的問題。我需要實現一個總結列表中產品所有價格的謂詞。但是,現在,我沒有更進一步。 我在做什麼錯? 在此先感謝。序言 - 對事實的小練習

domains 
    state = reduced ; normal 

database 
    producte (string, integer, state) 
predicates 
    nondeterm calculate(integer) 

clauses 
    % ---> producte(description , price , state) 
    producte("Enciam",2,normal). 
    producte("Llet",1,reduced). 
    producte("Formatge",5,normal). 
    calculate(Import):- 
     producte(_,Import,_). 
    calculate(Import):- 
     producte(_,Import,_), 
     calculate(Import2), 
     Import=Import2+Import,!. 

Goal 
    calculate(I). 
+0

你想做什麼?在PROLOG中,你需要指定哪些是真實的。 「producte」(「Enciam」,2,普通)。「恩西姆說,價格2和狀態正常的產品確實是一種產品。 「calculate(Import): - producte(_,Import,_)」行。「如果某些產品具有價格導入,則導入滿足會計算。這沒有什麼意義。如果你想要一個計算列表中事物總數的例子,我將很樂意提供一個... – Patrick87 2012-01-05 17:43:41

+0

非常感謝。但是,如果它必須與「事實/數據庫」? – mkll 2012-01-05 17:53:49

回答

1

免責聲明:當談到prolog時,我有點虛弱。此外,我現在無法訪問prolog解釋器。

典型的例子,一個列表的總和:

sum([], 0). 
sum([Head | Tail], Total) :- sum(Tail, Temp), Total is Head + Temp. 

列清單與的findall/3:

findall(Val, producte(_, Val, _), Vals). 

丘壑具有要總結你的列表中。

更新:根據您的評論,我有點出於我的深度而無法使用口譯員。

calculate(I) :- sum(Vals, I), findall(Val, producte(_, Val, _), Vals). 

我覺得這裏做的事情:

使用您的單一目標I,接收總結你的丘壑名單,這是由產生的findall的結果。但是自從我使用prolog之後已經很長時間了,我甚至沒有足夠的語法來做我想做的事情。然而,一個小的變化應該完成你想要的一個目標。

+0

我很感謝你的幫助。我只能在「目標」上傳遞一個參數:I(作爲接收的總價)。 – mkll 2012-01-05 17:57:06

+0

@mkll - 如果我的更新沒有幫助,希望Mog的回答就足夠了(對我來說很好)。我無法進行試錯式編程,無法訪問口譯員來修復我的答案。 – ccoakley 2012-01-05 18:12:20

+0

非常感謝你。我解決了這個問題! – mkll 2012-01-07 01:46:33

0

的部分的findall:

calculate(Price) :- 
    List = [ Price || producte(_, Price, _) ], 
    sum_list(List, 0, Sum). 

的sum_list部分:

sum_list([], Acc, Acc). 
sum_list([Head|Tail], Acc, Sum) :- 
    NewAcc is Acc + Head, 
    sum_list(Tail, NewAcc, Sum). 

我想這些方針的東西應該根據視覺序言doc的工作,但我有點不想安裝visual-序言來測試它...

+0

我迷失在我的那個問題中。你認爲要實現這個謂詞我們需要傳遞2個參數嗎?計算(List,Sum)列表和整數。 – mkll 2012-01-05 18:06:34

+0

我編輯過,現在應該符合視覺方法。 – m09 2012-01-05 18:07:55

+0

非常感謝。我確實解決了這個問題! – mkll 2012-01-07 01:46:13