Prolog - 列表的增量值
Prolog - increment value of list
我是 Prolog 的新手,基本上在计数器方面遇到了一些困难。
此代码有效:
listProf(L1) :-
findall((LastName,FirstName,Id), professor(Id,LastName,FirstName), L1).
L1
是一个列表,格式如下:L1(LastName,FirstName, Id)
所以现在我有一个列表 L1
。我需要在此列表之后创建一个新列表,其格式为:
L2(LastName, FistName, NumberOfCredits)
如果 L1 中的 ID 与 中的 ID 匹配,NumberOfCredits 应增加 3:
groupeCours( _, _, _, _,Id,( _, _))
.
我想到了这个,但显然行不通:
profNbcredits(L) :-
findall((LastName,FirstName,NbCredits),
( listProf([(_,_,Id)]),
groupeCours( _, _, _, _,Id,( _, _)),
NbCredits is NbCredits +3
),
L).
我知道 "NbCredits is NbCredits +3" 在逻辑编程中不起作用,我需要两个 "variables" 但我找不到方法。
另外,我不确定:listProf([(,,Id)])。有了这个,我试图获取列表 listProf 中每个三胞胎的 ID。
你有什么想法吗?
一点 "database" :
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').
我认为您不需要 listProf/1
来完成您的任务。此外,您没有从 0
信用计数开始(0
没有出现在您的代码中的任何地方)。
虽然您的问题从来没有直截了当地说出您正在尝试做什么以及假设是什么,但看起来您最终是在尝试确定每位教授提供的总学分,并且假设是简单地说,每门课程固定在3个学分。我本来希望有一个课程数据库,它表明有多少学分适用,但那似乎不是你所拥有的。
从提供给定教授 ID 的总学分的谓词开始可能更有意义:
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).
我是 Prolog 的新手,基本上在计数器方面遇到了一些困难。
此代码有效:
listProf(L1) :-
findall((LastName,FirstName,Id), professor(Id,LastName,FirstName), L1).
L1
是一个列表,格式如下:L1(LastName,FirstName, Id)
所以现在我有一个列表 L1
。我需要在此列表之后创建一个新列表,其格式为:
L2(LastName, FistName, NumberOfCredits)
如果 L1 中的 ID 与 中的 ID 匹配,NumberOfCredits 应增加 3:
groupeCours( _, _, _, _,Id,( _, _))
.
我想到了这个,但显然行不通:
profNbcredits(L) :-
findall((LastName,FirstName,NbCredits),
( listProf([(_,_,Id)]),
groupeCours( _, _, _, _,Id,( _, _)),
NbCredits is NbCredits +3
),
L).
我知道 "NbCredits is NbCredits +3" 在逻辑编程中不起作用,我需要两个 "variables" 但我找不到方法。 另外,我不确定:listProf([(,,Id)])。有了这个,我试图获取列表 listProf 中每个三胞胎的 ID。
你有什么想法吗?
一点 "database" :
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').
我认为您不需要 listProf/1
来完成您的任务。此外,您没有从 0
信用计数开始(0
没有出现在您的代码中的任何地方)。
虽然您的问题从来没有直截了当地说出您正在尝试做什么以及假设是什么,但看起来您最终是在尝试确定每位教授提供的总学分,并且假设是简单地说,每门课程固定在3个学分。我本来希望有一个课程数据库,它表明有多少学分适用,但那似乎不是你所拥有的。
从提供给定教授 ID 的总学分的谓词开始可能更有意义:
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).