1:- use_module(library(scasp)). 2:- use_module(library(scasp/html)). 3:- use_module(library(scasp/output)). 4
5:- use_module('PAS_rules'). 6:- use_module('PAS_guide'). 7:- use_module('PAS_patient'). 8
9:- use_module(library(http/http_server)). 10:- use_module(library(http/html_write)). 11:- use_module(library(http/js_write)). 12:- use_module(library(http/html_head)). 13:- use_module(library(http/jquery)). 14:- use_module(library(http/http_dispatch)). 15:- use_module(library(dcg/high_order)). 16:- use_module(library(http/term_html)). 17
21
22server(Port) :-
23 http_server([port(Port)]).
24
25:- http_handler(root(.), home, []). 26:- http_handler(root(solve), solve, [id(solve)]). 27
28home(_Request) :-
29 reply_html_page([ title('s(CASP) PAS demo')
30 ],
31 [ h1('s(CASP) PAS demo'),
32 \patient_form(1)
33 ]).
34
35case(1,
36 [ case_measurement(age, 76),
37 case_evidence(african_american),
38 case_evidence(male),
39
40 41 case_evidence(nyha_class_4),
42 case_evidence(accf_stage_c),
43
44 45 case_contraindication(continuous_positive_airway_pressure),
46
47 48 case_diagnosis(ischemic_heart_disease),
49 case_diagnosis(hypertension),
50 case_diagnosis(diabetes),
51 case_diagnosis(atrial_fibrillation),
52
53 54
55 56 case_evidence(sleepApnea),
57 case_evidence(angina),
58
59 60 case_history(stroke),
61 case_history(ischemic_attack),
62
63 64 case_measurement(lvef, 0.35),
65 case_measurement(heart_rate, 72),
66 case_measurement(creatinine, 1.9),
67 case_measurement(glomerular_filtration_rate, 55),
68 case_measurement(potassium, 4.2),
69
70 71 case_history(ace_inhibitors),
72 case_history(beta_blockers)
73 ]).
74
75
76patient_form(Case) -->
77 html_requires(jquery),
78 html_requires(scasp),
79 { case(Case, Data),
80 length(Data, Length),
81 Rows is max(20,Length+1),
82 with_output_to(string(String),
83 forall(member(D, Data),
84 format('~q.~n', [D])))
85 },
86 html([ h4('Patient data'),
87 textarea([id(data), rows(Rows), cols(60)],
88 String),
89 h4('Query'),
90 '?- ', input([id(query),
91 value('chose(ace_inhibitors)')]),
92 h4(''),
93 button(id(solve), 'Solve'),
94 button(id(clear), 'Clear'),
95 div(id(results), [])
96 ]),
97 button_actions.
98
99button_actions -->
100 { http_link_to_id(solve, [], SolveURL) },
101 js_script({|javascript(SolveURL)||
102$(function() {
103
104$("#solve").on("click", function() {
105 var data = $("#data").val();
106 var query = $("#query").val();
107 $.get(SolveURL,
108 { data: data,
109 query: query
110 },
111 function(reply) {
112 var results = $("#results");
113
114 results.html(reply);
115 results.sCASP('swish_answer');
116 });
117});
118
119$("#clear").on("click", function() {
120 $("#results").empty();
121});
122
123});
124 |}).
125
126
127solve(Request) :-
128 http_parameters(Request,
129 [ data(Data, []),
130 query(QueryS, [])
131 ]),
132 setup_call_cleanup(
133 open_string(Data, In),
134 read_terms(In, Terms),
135 close(In)),
136 patient_data(Terms),
137 term_string(Query, QueryS, [variable_names(VNames)]),
138 call_time(findall(result(N, Time, VNames, Model, Justification),
139 call_nth(call_time(scasp(Query, Model, Justification), Time), N),
140 Results),
141 TotalTime),
142 reply_html_page([],
143 \results(Results, TotalTime)).
144
145scasp(Query, Model, Justification) :-
146 scasp(Query),
147 scasp_model(Model),
148 scasp_justification(Justification, []).
149
150results([], Time) -->
151 !,
152 html(h3('No models (~3f sec)'-[Time.cpu])).
153results(Results, _Time) -->
154 sequence(result, Results).
155
156result(result(N, Time, Bindings, Model, Justification)) -->
157 { ovar_analyze_term(t(Bindings,Model,Justification))
158 },
159 html(div(class(result),
160 [ h3('Result #~D (~3f sec)'-[N, Time.cpu]),
161 \binding_section(Bindings),
162 \html_model(Model, [class('collapsable-content')]),
163 \html_justification_tree(Justification, [])
164 ])).
165
166read_terms(In, Terms) :-
167 read_term(In, Term0, []),
168 read_terms(Term0, In, Terms).
169
170read_terms(end_of_file, _, []) :-
171 !.
172read_terms(Term, In, [Term|T]) :-
173 read_term(In, Term1, []),
174 read_terms(Term1, In, T).
175
177
178binding_section([]) -->
179 !.
180binding_section(Bindings) -->
181 html(div(class(bindings),
182 [ h4('Bindings'),
183 \bindings(Bindings)
184 ])).
185
189
190bindings([]) -->
191 [].
192bindings([H|T]) -->
193 binding(H),
194 bindings(T).
195
196binding(Name=Value) -->
197 html(div(class(binding),
198 [ var(Name),
199 ' = ',
200 \term(Value, [])
201 ]))