2016-03-19 11 views
1

group_events(G,Events) ist wahr, wenn Events ist die Liste der Ereignisse, die für die Gruppe G geplant werden sollte. Mein Code ist wie folgt:Verwenden Mitglied/2 Prädikat, um eine Liste von Ereignissen in Prolog

studying(csen602, group2MET). 

event_in_course(csen602, quiz1, quiz). 
event_in_course(csen602, quiz2, quiz). 
event_in_course(csen602, quiz3, quiz). 

group_events(G,[Name|T]):- 
    studying(Course,G), 
    event_in_course(Course,Name,_), 
    \+member(Name,T), 
    group_events(G,T). 


group_events(G,Events):- 
    member(Name,Events), 
    studying(Course,G), 
    event_in_course(Course,Name,Type). 

, was ich bekomme, wenn die Abfrage group_events mit (group2MET, E) ist:

E = [quiz1|_G567] 
E = [quiz2|_G502] 
E = [quiz3|_G502] 
E = [_G501, quiz1|_G505] 
E = [_G501, quiz2|_G505] 
E = [_G501, quiz3|_G505] 

und so weiter ...

ich glaube, das Problem ist, mit dem member/2 Prädikat so irgendwelche Hilfe, wie das zu lösen?

+0

'_Gxxx' sind instanziierte Variablen wollen. Verfolgen oder durchlaufen Sie Ihr Programm, wenn Sie 'group_events (group2MET, E) 'abfragen. – lurker

+0

Wenn du etwas von etwas finden willst, solltest du 'findall' irgendwo verwenden. – SQB

Antwort

0

Ich glaube, Sie

group_events(G,Events):- 
    setof(Event, Course^Desc^(
     studying(Course,G), 
     event_in_course(Course,Event,Desc) 
    ), Events). 
+0

Schlägt 'setof/3' nicht fehl, wenn _Goal_ keine Lösungen hat? (http://www.swi-prolog.org/pldoc/man?predicate=bagof/3) – SQB

0

Das Problem besteht darin, dass Sie nicht mit einer leeren Liste beginnen, sondern mit einer nicht abgeschlossenen Liste, zu der Sie Ereignisse hinzufügen, die Sie untersuchen möchten, und die Sie auf Mitgliedschaft prüfen.
Aber diese Liste ist noch uninstantiiert, so dass der Schwanz davon und jedes Mitglied, das Sie daraus erhalten, ebenfalls deinstalliert wird.


Sie wollen find all Ereignisse, die zu untersuch müssen, so dass ein guter Ansatz wäre, zunächst ein study_event(G, E) zu definieren, die E ein Ereignis definiert, die für G von einer Gruppe untersucht werden muss, und dann verwenden findall/3 um alle diese Ereignisse zu finden.

Verwandte Themen