Skip to content

Instantly share code, notes, and snippets.

@ggb
Created March 21, 2017 21:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ggb/0ed4d5be55b75dfd62075e9cbfd29483 to your computer and use it in GitHub Desktop.
Save ggb/0ed4d5be55b75dfd62075e9cbfd29483 to your computer and use it in GitHub Desktop.
Database and solutions from "Structure and Interpretation of Computer Programs", Chapter 4.4
#lang datalog
town(ben, slumerville).
street(ben, ridge_road).
str_number(ben, 10).
department(ben, computer).
position(ben, guru).
salary(ben, 60000).
town(alyssa, cambridge).
street(alyssa, mass_ave).
str_number(alyssa, 78).
department(alyssa, computer).
position(alyssa, programmer).
salary(alyssa, 40000).
boss(alyssa, ben).
town(cy, cambridge).
street(cy, ames_street).
str_number(cy, 3).
department(cy, computer).
position(cy, programmer).
salary(cy, 35000).
boss(cy, ben).
town(lem, boston).
street(lem, bay_state_road).
str_number(lem, 22).
department(lem, computer).
position(lem, technician).
salary(lem, 25000).
boss(lem, ben).
town(louis, slumerville).
street(louis, pine_tree_road).
str_number(louis, 80).
department(louis, computer).
position(louis, programmer).
level(louis, trainee).
salary(louis, 30000).
boss(louis, alyssa).
boss(ben, oliver).
town(oliver, swellesley).
street(oliver, top_heap_road).
department(oliver, management).
position(oliver, boss).
salary(oliver, 150000).
town(eben, weston).
street(eben, shady_lane).
str_number(eben, 10).
department(eben, accounting).
position(eben, accountant).
salary(eben, 75000).
boss(eben, oliver).
town(robert, allston).
street(robert, havard_street).
str_number(robert, 16).
department(robert, accounting).
position(robert, scribe).
salary(robert, 18000).
boss(robert, eben).
town(dewitt, slumerville).
street(dewitt, onion_square).
str_number(dewitt, 5).
department(dewitt, management).
position(dewitt, secretary).
salary(dewitt, 25000).
boss(dewitt, oliver).
computer_programmer(X) :-
department(X, computer),
position(X, programmer).
% Exercise 4.55
ben_boss(X) :-
boss(X, ben).
all_accounting(X, Y) :-
department(X, accounting),
position(X, Y).
address(N, X, Y, Z) :-
town(N, X),
street(N, Y),
str_number(N, Z).
all_in_slumerville(X, Y, Z) :-
address(X, slumerville, Y, Z).
% Exercise 4.56
all_boss_ben(N, X, Y, Z) :-
ben_boss(N),
address(N, X, Y, Z).
% Not possible in Racket-Datalog because "<" is not supported :-/
%salary_lower_ben(N, S) :-
% salary(ben, X),
% salary(N, S),
% S < Y.
not_computer_department(X, N, P) :-
boss(X, N),
department(N, D),
D != computer,
position(N, P).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment