CapelliC, , -, . if-else, . .
-, , , - , Prolog. Prolog , . , , ; , , :
person(john).
person(fred).
person(harry).
person(mary).
person(julie).
person(susan).
person(anne).
. , - , - .
% John, Fred and Harry are men, Mary, Julie, Susan and Anne are women.
male(john).
male(fred).
male(harry).
female(mary).
female(julie).
female(susan).
female(anne).
. :
% John has blonde hair while Fred and Harry have dark hair.
% Julie and Susan are blonde, Mary and Anne are brunette.
person_hair(john, blond).
person_hair(fred, dark).
person_hair(harry, dark).
person_hair(julie, blond).
person_hair(susan, blond).
person_hair(mary, dark).
person_hair(anne, dark).
, : - , - . "" , , , :
% A brunette is a female with dark hair
brunette(X) :-
female(X),
person_hair(X, dark).
, , :
person_owns(fred, gold).
person_owns(julie, gold).
is_rich(X) :-
%person(X),
person_owns(X, gold).
, :
person_likes(M, F) :-
male(M),
female(F).
person_likes(F, M) :-
female(F),
male(M).
, 3 x 4 + 4 x 3 = 24 person_likes(A, B) - :
?- bagof(A-B, person_likes(A, B), R), length(R, Len).
R = [john-mary, john-julie, john-susan, john-anne, fred-mary, fred-julie, fred-susan, fred-anne, ... - ...|...],
Len = 24.
: , person_owns/2, . ? :
is_heterosexual(H) :-
person(H).
, ; , - , . , , ( if-then-else, , ):
opposite_sex(X, Y) :-
( male(X)
-> female(Y)
; female(X)
-> male(Y)
).
, :
opposite_sex(M, F) :-
male(M), female(F).
opposite_sex(F, M) :-
male(M), female(F).
person_likes/2 , , :
person_likes(X, Y) :-
opposite_sex(X, Y),
fits_personal_taste(X, Y).
. :
fits_personal_taste(julie, X) :-
is_rich(X),
person_hair(X, dark).
. , , . , :
% Anyone (male) would fit Anne tastes
fits_personal_taste(anne, _).
, , , :
person_preferences(julie, [is_rich, person_hair(dark)]).
person_preferences(harry, [is_rich]).
% and so on
fits_personal_taste/2 - :
fits_personal_taste(X, Y) :-
( person_preferences(X, Ps)
-> maplist(fits_preference(Y), Ps)
; true
).
if-else Prolog: .
, , ; .
fits_preference/2? , , - , . Univ- =.., person_hair(Color), person_hair(Person, Color) :
fits_preference(Person, Preference) :-
Preference =.. [F|Args],
Preference1 =.. [F,Person|Args],
call(Preference1).
, , person_preferences :
person_preferences(julie, P, [is_rich(P), person_hair(P, dark)]).
person_preferences(harry, P, [is_rich(P)]).
% and so on
fits_personal_taste/2 :
fits_personal_taste(X, Y) :-
( person_preferences(X, Y, Ps)
-> maplist(call, Ps)
; true
).
person_preferences/3 , ; , , , .
, possible_pair/2, , :
possible_pair(X, Y) :-
person_likes(X, Y),
person_likes(Y, X),
X @< Y.
, , , .
:
?- bagof(A-B, possible_pair(A, B), R).
R = [fred-mary, anne-fred].
, "",
?- bagof(A-B, person_likes(A, B), R), write(R).
[john-julie,fred-mary,fred-anne,harry-julie,susan-john,anne-john,mary-fred,julie-fred,susan-fred,anne-fred,mary-harry,susan-harry,anne-harry]
R = [john-julie, fred-mary, fred-anne, harry-julie, susan-john, anne-john, mary-fred, julie-fred, ... - ...|...].