2017-05-27 3 views
0

La structure des faits estComment accéder à un élément spécifique de fait dans une liste Prolog

%structure 
student(ID,FirstName,LastName,[courseList]). 
course(CourseCode,CourseTtile,Credits,Level). 

Suite est le fait.

student(20135639,'Mohammed','Abdul Wahab', 
[course('ITIS411','DATABASE SYSTEM IMPLEMENTATION',3,hard), 
course('ITIS412','INFORMATION SECURITY',3 ,easy), 
course('ITIS499','SENIOR PROJECT',3,hard), 
course('ITIS469','AI',3,hard)]). 

Je veux écrire une règle qui résume les crédits heures de la liste

sum([],0). 
sum(H|T,S):- 
sum(T,S1), 
S is H + S1. 


sumCr(Id, Cr):- 
    student(Id,_,_,Courselist), 
    sum(Courselist,Cr).  

La règle ci-dessus résume tous les éléments des faits dans la liste mais je veux résumer seulement la valeur Cr de tous les faits dans la liste. Donc, quand je lance la requête suivante, la sortie devrait être.

?. sumCr(20135639, Cr). 
    Cr=12.  
+0

'sum' ne résume rien; il donne '0' pour une liste vide et une variable non liée pour une liste plus longue. –

+0

J'ai corrigé l'erreur @ScottHunter – Far

+1

'somme (H | T, S)' a des problèmes de syntaxe. De plus, votre somme/2 est destinée à additionner une liste d'entiers, mais vous lui passez une liste de noms de cours (ou quelque chose, ce n'est pas clair). – lurker

Répondre

0

Vous avez juste besoin d'extraire la partie de chaque course vous voulez résumer:

sum([], 0). 
sum([course(_,_,N,_)|T], Sum) :- 
    sum(T, NT), 
    Sum is NT + N. 
+0

C'est ce que je cherchais. Je vous remercie. – Far