View source with raw comments or as raw
    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)).
 server(+Port)
Start HTTP server at the indicated port.
   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       %* Assessments *%
   41       case_evidence(nyha_class_4),
   42       case_evidence(accf_stage_c),
   43
   44       %* Contraindications *%
   45       case_contraindication(continuous_positive_airway_pressure),
   46
   47       %* Diagnoses *%
   48       case_diagnosis(ischemic_heart_disease),
   49       case_diagnosis(hypertension),
   50       case_diagnosis(diabetes),
   51       case_diagnosis(atrial_fibrillation),
   52
   53       %* Dosages *%
   54
   55       %* Evidence *%
   56       case_evidence(sleepApnea),
   57       case_evidence(angina),
   58
   59       %* Illness History *%
   60       case_history(stroke),
   61       case_history(ischemic_attack),
   62
   63       %* Measurements *%
   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       %* Medication History *%
   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).
 binding_section(+Bindings)//
  178binding_section([]) -->
  179    !.
  180binding_section(Bindings) -->
  181    html(div(class(bindings),
  182             [ h4('Bindings'),
  183               \bindings(Bindings)
  184             ])).
 bindings(+Bindings)//
Report on the bindings.
  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             ]))