Skip to content

Commit e447c48

Browse files
author
GitHub Copilot
committed
✨ Add WASM Prolog logic puzzle solver
- Integrated SWI-Prolog WASM engine with fallback algorithms - Created LogicPuzzleSolver component for Alice/Bob/Charlie puzzle - Added step-by-step Prolog reasoning visualization - Enhanced UI with interactive puzzle selection - Updated PrologEngine with constraint satisfaction solvers - Fixed TypeScript types and added comprehensive error handling - Implemented visual demonstration of Prolog problem solving
1 parent 53ab79a commit e447c48

File tree

11 files changed

+1552
-681
lines changed

11 files changed

+1552
-681
lines changed

package-lock.json

Lines changed: 147 additions & 568 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
},
1313
"dependencies": {
1414
"react": "^19.1.0",
15-
"react-dom": "^19.1.0"
15+
"react-dom": "^19.1.0",
16+
"swipl-wasm": "^5.0.15"
1617
},
1718
"devDependencies": {
1819
"@eslint/js": "^9.30.1",
@@ -27,6 +28,6 @@
2728
"playwright": "^1.54.2",
2829
"typescript": "~5.8.3",
2930
"typescript-eslint": "^8.35.1",
30-
"vite": "^7.0.4"
31+
"vite": "^4.5.14"
3132
}
3233
}

src/App.css

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,54 @@
55
}
66

77
.app-header {
8-
text-align: center;
9-
padding: 40px 20px;
10-
background: rgba(255, 255, 255, 0.1);
8+
padding: 20px;
9+
position: relative;
10+
}
11+
12+
.back-button {
13+
background: rgba(255, 255, 255, 0.2);
14+
color: white;
15+
border: 2px solid rgba(255, 255, 255, 0.3);
16+
padding: 10px 20px;
17+
border-radius: 25px;
18+
font-size: 1rem;
19+
font-weight: 600;
20+
cursor: pointer;
21+
transition: all 0.3s ease;
1122
backdrop-filter: blur(10px);
12-
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
23+
text-transform: uppercase;
24+
letter-spacing: 1px;
1325
}
1426

15-
.app-header h1 {
16-
margin: 0 0 10px 0;
27+
.back-button:hover {
28+
background: rgba(255, 255, 255, 0.3);
29+
border-color: rgba(255, 255, 255, 0.5);
30+
transform: translateY(-2px);
31+
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
32+
}
33+
34+
.coming-soon-page {
35+
max-width: 800px;
36+
margin: 0 auto;
37+
padding: 60px 20px;
38+
text-align: center;
39+
background: rgba(255, 255, 255, 0.1);
40+
border-radius: 20px;
41+
backdrop-filter: blur(15px);
1742
color: white;
18-
font-size: 3rem;
19-
font-weight: 700;
20-
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
2143
}
2244

23-
.app-header p {
24-
margin: 0;
25-
color: rgba(255, 255, 255, 0.9);
26-
font-size: 1.2rem;
27-
font-weight: 300;
45+
.coming-soon-page h2 {
46+
font-size: 3em;
47+
margin-bottom: 20px;
48+
color: #feca57;
49+
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
50+
}
51+
52+
.coming-soon-page p {
53+
font-size: 1.5em;
54+
margin-bottom: 40px;
55+
opacity: 0.9;
2856
}
2957

3058
.app-main {

src/App.tsx

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,60 @@
1-
import { useState, useCallback } from 'react'
1+
import { useState } from 'react'
22
import { PrologEngine } from './hooks/usePrologEngine'
3+
import { LogicPuzzleSelector } from './components/LogicPuzzleSelector'
34
import SudokuSolver from './components/SudokuSolver'
4-
import LogicPuzzleSelector from './components/LogicPuzzleSelector'
5+
import { LogicPuzzleSolver } from './components/LogicPuzzleSolver'
56
import './App.css'
67

78
function App() {
8-
const [selectedPuzzle, setSelectedPuzzle] = useState<string>('sudoku')
9-
const prologEngine = new PrologEngine()
9+
const [currentPuzzle, setCurrentPuzzle] = useState<string | null>(null)
10+
const [prologEngine] = useState(() => new PrologEngine())
1011

11-
const handlePuzzleChange = useCallback((puzzle: string) => {
12-
setSelectedPuzzle(puzzle)
13-
}, [])
12+
const handlePuzzleSelect = (puzzleType: string) => {
13+
setCurrentPuzzle(puzzleType)
14+
}
15+
16+
const handleBackToSelector = () => {
17+
setCurrentPuzzle(null)
18+
}
1419

15-
const renderPuzzle = () => {
16-
switch (selectedPuzzle) {
20+
const renderCurrentPuzzle = () => {
21+
switch (currentPuzzle) {
1722
case 'sudoku':
18-
return <SudokuSolver prologEngine={prologEngine} />
23+
return <SudokuSolver prologEngine={prologEngine} onBack={handleBackToSelector} />
24+
case 'logic':
25+
return <LogicPuzzleSolver />
26+
case 'zebra':
27+
return (
28+
<div className="coming-soon-page">
29+
<h2>🦓 Zebra Puzzle</h2>
30+
<p>Einstein's riddle implementation coming soon...</p>
31+
<button onClick={handleBackToSelector} className="back-button">
32+
← Back to Selection
33+
</button>
34+
</div>
35+
)
1936
default:
20-
return <div>パズルを選択してください</div>
37+
return <LogicPuzzleSelector onPuzzleSelect={handlePuzzleSelect} />
2138
}
2239
}
2340

2441
return (
2542
<div className="app">
26-
<header className="app-header">
27-
<h1>Prolog論理パズルソルバー</h1>
28-
<p>Tau PrologとWASMを使った論理パズル解決アプリ</p>
29-
</header>
43+
<div className="app-header">
44+
{currentPuzzle && (
45+
<button onClick={handleBackToSelector} className="back-button">
46+
← Back to Puzzle Selection
47+
</button>
48+
)}
49+
</div>
3050

3151
<main className="app-main">
32-
<LogicPuzzleSelector
33-
selectedPuzzle={selectedPuzzle}
34-
onPuzzleChange={handlePuzzleChange}
35-
/>
36-
37-
<div className="puzzle-container">
38-
{renderPuzzle()}
39-
</div>
52+
{renderCurrentPuzzle()}
4053
</main>
54+
55+
<footer className="app-footer">
56+
<p>🧩 Logic Puzzle App with WASM Prolog • React + TypeScript</p>
57+
</footer>
4158
</div>
4259
)
4360
}

0 commit comments

Comments
 (0)