Код:
факт(Q,W,E,R) = Q<>W, E<>R;
факт(Q,W,E,R) = Q=W, E=R;
инфо(Номер,Национальность,Животное,Сигареты,Напиток,Цвет) :-
/* 1. Норвежец живёт в первом доме. */
факт(Номер,1,Национальность,норвежец),
/* 2. Англичанин живёт в красном доме. */
факт(Национальность,англичанин,Цвет,красный),
/* 3. Зелёный дом находится слева от белого, рядом с ним. */
факт(Цвет,зеленый,Номер,A),
инфо(A+1,_,_,_,_,белый);
/* 4. Датчанин пьёт чай. */
факт(Национальность,датчанин,Напиток,чай),
/* 6. Тот, кто живёт в жёлтом доме, курит Dunhill. */
факт(Цвет,желтый,Сигареты,dunhill),
/* 7. Немец курит Rothmans */
факт(Национальность,немец,Сигареты,rothmans),
/* 8. Тот, кто живёт в центре, пьёт молоко. */
факт(Номер,3,Напиток,молоко),
А вот на SQL
Код:
Create Table Nation(Nation Varchar(100))!
Create Table Pet(Pet Varchar(100))!
Create Table Sigar(Sigar Varchar(100))!
Create Table Drink(Drink Varchar(100))!
Create Table Color(Color Varchar(100))!
Create Table Table1(Nation Varchar(100),Pet Varchar(100),Sigar Varchar(100),Drink Varchar(100),Color Varchar(100))!
Insert Into Nation(Nation) Values('англичанин'),('датчанин'),('немец'),('швед'),('норвежец')!
Insert Into Pet(Pet) Values('кошка'),('птица'),('собака'),('лошадь'),('рыбка')!
Insert Into Sigar(Sigar) Values('dunhill'),('rothmans'),('marlboro'),('pallMall'),('winfield')!
Insert Into Drink(Drink) Values('чай'),('молоко'),('вода'),('кофе'),('пиво')!
Insert Into Color(Color) Values('красный'),('зеленый'),('желтый'),('синий'),('белый')!
Create Function Fact(A Varchar(100),B Varchar(100),C Varchar(100),D Varchar(100)) Returns Integer
Begin Return (A=B And C=D) Or (A<>B And C<>D); End!
Create Function Fact2(A Varchar(100),B Varchar(100),C Varchar(100),D Varchar(100),E Varchar(100),X Varchar(100),
A1 Varchar(100),B1 Varchar(100),C1 Varchar(100),D1 Varchar(100),E1 Varchar(100),X1 Varchar(100)) Returns Integer
Begin Return A<>B And A<>C And A<>D And A<>E And B<>C And B<>D And B<>E And C<>D And C<>E And D<>E And
((A=X And B1=X1) Or (B=X And C1=X1) Or (C=X And D1=X1) Or (D=X And E1=X1) Or
(B=X And A1=X1) Or (C=X And B1=X1) Or (D=X And C1=X1) Or (E=X And D1=X1)); End!
Insert Into Table1
Select * From Nation,Pet,Sigar,Drink,Color Where
Fact(Nation,'англичанин',Color, 'красный' ) And -- 2. Англичанин живёт в красном доме.
Fact(Nation,'датчанин' ,Drink, 'чай' ) And -- 4. Датчанин пьёт чай.
Fact(Color ,'желтый' ,Sigar, 'dunhill' ) And -- 6. Тот, кто живёт в жёлтом доме, курит Dunhill.
Fact(Nation,'немец' ,Sigar, 'rothmans') And -- 7. Немец курит Rothmans
Fact(Sigar ,'pallMall' ,Pet, 'птица' ) And -- 10. Тот, кто курит Pall Mall, выращивает птиц.
Fact(Pet ,'собака' ,Nation,'швед' ) And -- 11. Швед выращивает собак.
Fact(Pet ,'лошадь' ,Color, 'синий' ) And -- 13. Тот, кто выращивает лошадей, живёт в синем доме.
Fact(Sigar ,'winfield' ,Drink, 'пиво' ) And -- 14. Тот, кто курит Winfield, пьет пиво.
Fact(Color ,'зеленый' ,Drink, 'кофе' )! -- 15. В зелёном доме пьют кофе.
Select * From Table1 A, Table1 B, Table1 C, Table1 D, Table1 E Where
-- 1. Норвежец живёт в первом доме.
A.Nation='норвежец' And B.Nation<>'норвежец' And C.Nation<>'норвежец' And D.Nation<>'норвежец' And E.Nation<>'норвежец' And
-- 8. Тот, кто живёт в центре, пьёт молоко.
A.Drink<>'молоко' And B.Drink<>'молоко' And C.Drink='молоко' And D.Drink<>'молоко' And E.Drink<>'молоко' And
-- 3. Зелёный дом находится слева от белого, рядом с ним.
concat(A.Color, B.Color, C.Color, D.Color, E.Color) Like '%зеленыйбелый%' And
-- 5. Тот, кто курит Marlboro, живёт рядом с тем, кто выращивает кошек.
Fact2(A.Pet,B.Pet,C.Pet,D.Pet,E.Pet,'кошка',A.Sigar,B.Sigar,C.Sigar,D.Sigar,E.Sigar,'marlboro') And
-- 9. Сосед того, кто курит Marlboro, пьёт воду.
Fact2(A.Sigar,B.Sigar,C.Sigar,D.Sigar,E.Sigar,'marlboro',A.Drink,B.Drink,C.Drink,D.Drink,E.Drink,'вода') And
-- 12. Норвежец живёт рядом с синим домом.
Fact2(A.Color,B.Color,C.Color,D.Color,E.Color,'синий',A.Nation,B.Nation,C.Nation,D.Nation,E.Nation,'норвежец')!