% The following declaration is the key to having todo/1 persisted between pages.
:- session_predicate todo/1.
% update/1 maintains the state of the todo/1 predicate via assertions and retractions.
update(Get) :-
member(todo=Todo, Get),
assert(todo(Todo)).
update(Get) :-
member(remove=Todo, Get),
retract(todo(Todo)).
update(_).
/*<html>
<head>
<title>PSP Demo</title>
</head>
<body>
<a href="template.prolog?t=psp#psp">Back</a><br>
<a href="cookies.html">View Source</a><br><br>
<h1>To Do List</h1>
<form action="cookies.prolog" method="GET">
<input type="text" name="todo">
<input type="submit" value="Add">
</form>
<br>
<table>
<?,
update(Get),
forall(
todo(Todo),
?>
<tr>
<td><?= Todo ?></td>
<td>
<form action="cookies.prolog?remove=<?= Todo ?>" method="POST">
<input type="submit" value="done">
</form>
</td>
</tr>
<?
)
,?>
</table>
</body>
</html>*/