publishedMathPhilosophy/1 — editurile de matematică sau filosofie
Determinați lista editurilor (publishers) care au publicat cărți de matematică sau de filosofie. Definiți predicatul publishedMathPhilosophy/1 care returnează lista numelor editurilor care satisfac cerința.
?- publishedMathPhilosophy(Result).
Result = ['Springer', 'Cambridge University Press', 'Addison-Wesley']
Hint: atenție să nu apară duplicate în rezultat. Poți folosi
setof/3pentru a colecta id-urile editurilor, apoi să le mapezi la nume — saufindall/3urmat de un predicat care elimină duplicatele.
Te-ai blocat?
editor
soluție
fields(1, 'Mathematics').
fields(2, 'Computer Science').
fields(3, 'Philosophy').
fields(4, 'Physics').
fields(5, 'Linguistics').
authors(1, 'Donald Knuth', 'Stanford University').
authors(2, 'Bertrand Russell', 'University of Cambridge').
authors(3, 'Noam Chomsky', 'MIT').
authors(4, 'Roger Penrose', 'University of Oxford').
authors(5, 'Terence Tao', 'University of California, Los Angeles').
publishers(1, 'Springer', 'Germany').
publishers(2, 'MIT Press', 'USA').
publishers(3, 'Cambridge University Press', 'UK').
publishers(4, 'Oxford University Press', 'UK').
publishers(5, 'Addison-Wesley', 'USA').
books(101, 'The Art of Computer Programming', 1, 5, 2).
books(102, 'Principia Mathematica', 2, 3, 1).
books(103, 'Syntactic Structures', 3, 2, 5).
books(104, 'The Road to Reality', 4, 4, 4).
books(105, 'Analysis I', 5, 1, 1).
books(106, 'Modern Quantum Mechanics', 4, 1, 4).
books(107, 'Formal Semantics and Logic', 3, 3, 5).
books(108, 'Linear Algebra Done Right', 5, 5, 1).
% Colectăm ID-urile distincte de edituri care au publicat cărți cu FieldId = 1 (Math) sau 3 (Philosophy).
% setof sortează crescător, deci PIds = [1, 3, 5] → [Springer, Cambridge, Addison-Wesley].
publishedMathPhilosophy(Result) :-
setof(PId,
BId^Title^AId^FId^(books(BId, Title, AId, PId, FId),
(FId = 1 ; FId = 3)),
PIds),
findall(PName,
(member(PId, PIds), publishers(PId, PName, _)),
Result).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (1 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
publishedMathPhilosophy(Result).
așteptat: Result = ['Springer','Cambridge University Press','Addison-Wesley']