Update README with working WebAssembly usage example.
This commit is contained in:
67
README.md
67
README.md
@@ -197,15 +197,23 @@ Then a `pkg` directory will be created, containing everything you need for a web
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Scryer Prolog - Sudoku Solver Example</title>
|
||||
<script type="module">
|
||||
import init, { eval_code } from './pkg/scryer_prolog.js';
|
||||
import initScryer, { MachineBuilder } from "./pkg/scryer_prolog.js";
|
||||
|
||||
const run = async () => {
|
||||
await init("./pkg/scryer_prolog_bg.wasm");
|
||||
let code = `
|
||||
// Initialize Scryer Prolog with WASM
|
||||
const wasm = await fetch("./pkg/scryer_prolog_bg.wasm");
|
||||
const module = await WebAssembly.compile(await wasm.arrayBuffer());
|
||||
await initScryer(module);
|
||||
|
||||
// Set up the Prolog machine
|
||||
const machine = new MachineBuilder().build();
|
||||
|
||||
// Knowledge base: Sudoku rules and problem definition
|
||||
const kb = `
|
||||
:- use_module(library(format)).
|
||||
:- use_module(library(clpz)).
|
||||
:- use_module(library(lists)).
|
||||
@@ -216,15 +224,15 @@ Then a `pkg` directory will be created, containing everything you need for a web
|
||||
maplist(all_distinct, Rows),
|
||||
transpose(Rows, Columns),
|
||||
maplist(all_distinct, Columns),
|
||||
Rows = [As,Bs,Cs,Ds,Es,Fs,Gs,Hs,Is],
|
||||
blocks(As, Bs, Cs),
|
||||
blocks(Ds, Es, Fs),
|
||||
blocks(Gs, Hs, Is).
|
||||
Rows = [A,B,C,D,E,F,G,H,I],
|
||||
blocks(A, B, C),
|
||||
blocks(D, E, F),
|
||||
blocks(G, H, I).
|
||||
|
||||
blocks([], [], []).
|
||||
blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :-
|
||||
all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]),
|
||||
blocks(Ns1, Ns2, Ns3).
|
||||
blocks([A,B,C|T1], [D,E,F|T2], [G,H,I|T3]) :-
|
||||
all_distinct([A,B,C,D,E,F,G,H,I]),
|
||||
blocks(T1, T2, T3).
|
||||
|
||||
problem(1, [[_,_,_,_,_,_,_,_,_],
|
||||
[_,_,_,_,_,3,_,8,5],
|
||||
@@ -235,19 +243,40 @@ Then a `pkg` directory will be created, containing everything you need for a web
|
||||
[5,_,_,_,_,_,_,7,3],
|
||||
[_,_,2,_,1,_,_,_,_],
|
||||
[_,_,_,_,4,_,_,_,9]]).
|
||||
|
||||
main :-
|
||||
problem(1, Rows), sudoku(Rows), maplist(portray_clause, Rows).
|
||||
|
||||
:- initialization(main).
|
||||
`;
|
||||
const result = eval_code(code);
|
||||
document.write(`<p>Sudoku solver returns:</p><pre>${result}</pre>`);
|
||||
|
||||
machine.consultModuleString("user", kb);
|
||||
|
||||
// Run the query
|
||||
const query = "problem(1, Rows), sudoku(Rows), maplist(portray_clause, Rows).";
|
||||
const answers = machine.runQuery(query);
|
||||
|
||||
const formattedSolutions = [];
|
||||
|
||||
// Format the answers
|
||||
for (let solution = answers.next(); !solution.done; solution = answers.next()) {
|
||||
const rows = solution.value.bindings["Rows"].list;
|
||||
|
||||
const grid = rows.map(row =>
|
||||
row.list.map(cell => cell.integer)
|
||||
);
|
||||
|
||||
const formatted = grid.map(row => `[${row.join(", ")}]`).join("\n");
|
||||
formattedSolutions.push(formatted);
|
||||
console.log(formatted);
|
||||
}
|
||||
run();
|
||||
|
||||
// Output results
|
||||
document.write(`<p>Sudoku solver returns:</p>`);
|
||||
for (const solution of formattedSolutions) {
|
||||
document.write(`<pre>${solution}</pre>`);
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body></body>
|
||||
|
||||
</html>
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user