2017-04-20 34 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