-
Notifications
You must be signed in to change notification settings - Fork 1
/
prereq_proc.pl
91 lines (72 loc) · 2.37 KB
/
prereq_proc.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
:- module(prereq_proc, [requirement_to_list/2, requirement_to_string/3]).
:- license(lgpl).
:- use_module(handcodedDB, [major/2, course/5, requirement/3]).
%output all possible way of complete prerequirest as a list
%it can take either course as first input and loop up database by itself
%or take a requirement and output it's possible combination
%
%example of usage:
%?- requirement_to_list(requirement('CSE', '12', bool(or(val(id('CSE', '11')), val(id('CSE', '8B'))))),X).
%X = ['CSE 11']
%X = ['CSE 8B']
%
%?- requirement_to_list('CSE 12',X).
%X = ['CSE 8B']
%X = ['CSE 11']
requirement_to_list(requirement(_,_,bool(B)),X):-
!,boolprereqs_to_list(B,X,[]).
requirement_to_list(Course,X):-
!,requirement(D, I ,bool(B)),
atom_concat(D, ' ', T),
atom_concat(T, I, Course),
boolprereqs_to_list(B,X,[]).
%Present them as a boolean expression.
% - An operand (value) is the term `val(Op)`
% - An AND is the term `and(X, Y)`
% - An OR is the term `or(X, Y)`
% Examples:
% - (a AND b AND c):
% and(val(a), and(val(b), val(c)))
% OR
% and(and(val(a), val(b)), val(c))
% - (a OR (b AND c)):
% or(val(a), and(val(b), val(c)))
% - (a AND b AND (c OR d)) OR (f AND g):
% or(and(val(a), and(val(b), or(val(c), val(d)))), and(val(f), val(g)))
%
% ... and so on.
%
% Convert the boolean expresssions to lists,1
% enumerating the different possibilities by backtracking
%
bool_to_list(none, Rest, Rest).
bool_to_list(val(X), [X|Rest], Rest).
bool_to_list(and(X, Y), L0, L1) :-
bool_to_list(X, L0, L),
bool_to_list(Y, L, L1).
bool_to_list(or(X, Y), L0, L1) :-
( bool_to_list(X, L0, L1)
; bool_to_list(Y, L0, L1)
).
% same as bool_to_list, but only work for requirment, for
% val(id(Dept,#)) list.
boolprereqs_to_list(none, Rest, Rest).
boolprereqs_to_list(val(id(X,Y)), [C|Rest], Rest):-
atomic_concat(X,' ',Z),
atomic_concat(Z,Y,C).
boolprereqs_to_list(and(X, Y), L0, L1) :-
boolprereqs_to_list(X, L0, L),
boolprereqs_to_list(Y, L, L1).
boolprereqs_to_list(or(X, Y), L0, L1) :-
( boolprereqs_to_list(X, L0, L1)
; boolprereqs_to_list(Y, L0, L1)
).
%output requirement as a string format,
requirement_to_string(Dept,ID,Result):-
requirement(Dept,ID,bool(B)),
boolprereqs_to_list(B,L,[]),
atomic_list_concat(L, '+', Prep),
atom_concat(Dept,ID,Y),
atom_concat(Y,": ",X),
atom_concat(X,Prep,Atom),
atom_string(Atom,Result).