2017-04-20 36 views
0

我是Prolog的新手,基本上有一些問題。Prolog - 列表的增量值

此代碼:

listProf(L1) :- 
    findall((LastName,FirstName,Id), professor(Id,LastName,FirstName), L1). 

L1是一個列表,並具有以下形式下:L1(LastName,FirstName, Id)

所以現在我有一個列表L1。我需要這一個後創建一個新的列表,即形式下: L2(LastName, FistName, NumberOfCredits)

NumberOfCredits應該由3遞增如果ID在L1匹配在ID: groupeCours(_, _, _, _,Id,(_, _))

我想到這一點,但顯然是行不通的:

profNbcredits(L) :- 
    findall((LastName,FirstName,NbCredits), 
     ( listProf([(_,_,Id)]), 
     groupeCours(_, _, _, _,Id,(_, _)), 
     NbCredits is NbCredits +3 
    ), 
     L). 

我知道「NbCredits是NbCredits +3」邏輯編程不工作,而我需要兩個「變量」,但我不能設法找到一種方法。 此外,我不確定:listProf([(,,Id)])。有了這個我試圖讓列表listProf中的每個三胞胎的Id。

你有什麼想法嗎?

「數據庫」的位:

groupeCours('INF1110', 20, 32003, 100, 'TREJ4',('Thursday',1)). 
groupeCours('INF1110', 30, 32003, 100, 'PASB1',('Wednesday',2)). 
groupeCours('INF1130', 10, 32003, 100, 'PASB1',('Monday',2)). 

professor('TREJ4', 'Tremblay', 'Jean'). 
professor('DEVL2', 'De Vinci', 'Leonard'). 
professor('PASB1', 'Pascal', 'Blaise'). 
professor('GOLA1', 'Goldberg', 'Adele'). 
+0

名單形式爲'L1(LastName,FirstName,Id)'沒有意義。你的意思是一個列表'L1',其元素的形式是'(LastName,FirstName,Id)'? – lurker

+1

當你說,如果'L1'中的'Id'匹配*,'NumberOfCredits'應該增加3,但是你想增加的'NumberOfCredits'的原始值來自 – lurker

+0

是的我的意思是列表L1其元素是(LastName,FirstName,Id)。而對於NumberOfCredits,在列表掃描開始時它應該是0 – Tirvax

回答

0

我不認爲你需要listProf/1來完成你的任務。此外,您無法以0信用計數(0未出現在代碼中的任何位置)開始。

雖然你的問題從來沒有出現過,並說你想要做什麼和假設是什麼,它看起來像你最終試圖確定每個教授提供的總學分,並且這個假設是簡單的每門課程固定在3學分。我本來希望有一個課程數據庫能夠顯示有多少學分可以應用,但這似乎並不是你所擁有的。

它可能會更有意義,然後開始與提供給定教授編號總學分謂詞:

professor_total_credits(ProfId, TotalCredits) :- 
    findall(3, groupeCours(_, _, _, _, ProfId, _), Credits), 
    sum_list(Credits, TotalCredits). 

然後你可以一一列舉:

professors_total_credits(ProfTotalCredits) :- 
    findall((ProfLast, ProfFirst, Credits), 
      (professor(Id, ProfLast, ProfFirst), 
      professor_total_credits(Id, Credits)), 
      ProfTotalCredits). 
+0

非常感謝! – Tirvax