Prolog if else syntax

I can't seem to get the if else statement to work.

  • John, Fred and Harry are men, Mary, Julie, Susan and Anne are women.
  • John has fair hair, and Fred and Harry have dark hair.
  • Julia and Susan are blonde, Mary and Ann are brunette.
  • Rich is every person who owns gold - Fred and Julie in our example.
  • Husband, as soon as a woman, and vice versa. Moreover, John and Harry, like rich people, John loves a blonde, and Fred loves a brunette.
  • Both Mary and Julia, like people with dark hair, Julia at the same time loves the rich.
male(john).
male(fred).
male(harry). 

female(mary).
female(julie).
female(susan).
female(anne).

hasblonde(X):-(male(X),X = john);(female(X),X = susan);(female(X),X = julie).

hasdarkhair(X):-(male(X),X = harry);(male(X),X = fred).

hasbrunette(X):-(female(X),X = mary);(female(X),X = anne).

isrich(X):-(female(julie),X=julie);(male(fred),X=fred).


likes(male(X),female(Y));likes(female(X),male(Y)):-likes(X,Y).    
likes(X,Y):-
 ((X==julie)->
    ((hasdarkhair(Y))->
        (female(X), male(Y));
        male(X));
    female(X),male(Y));
 ((X==julie)->
    ((isrich(Y))->
        (female(X), male(Y));
        male(X));
    female(X),male(Y));
 ((X=mary)->
    ((hasdarkhair(Y))->
        (female(X), male(Y));
        male(X));
    female(X),male(Y));
 ((X=john)->
    ((isrich(Y))->
        (female(X), male(Y));
        female(X));
    male(X),female(Y));
((X=harry)->
    ((isrich(Y))->
        (female(X), male(Y));
        female(X));
    male(X),female(Y));    
 ((X=fred)->
        ((hasbrunette(Y))->
            (female(X), male(Y));
            female(X));
    male(X),female(Y)).

I thought (Statement) → (if true, this statement is executed); (if false, run this statement). was the right approach to this in Prolog. Why is this what I write for

likes(MaleName,FemaleName) 
likes(FemaleName,MaleName)

does it return true?

+4
source
5

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, ... - ...|...].
+5

, , :

: p1 ; p2 :- p3. .

?- [user].
p1;p2:-p3.
ERROR: user://1:9:
    No permission to modify static procedure `(;)/2'
    ...

Prolog "" , Horn

, , , .

: " " . : -)

,

rich(Person) :- owns(Person, gold).
owns(fred, gold).
owns(julie, gold).

Zebra, , , , [zebra-puzzle] . , if/then/else - . Prolog.

+1

, , , . , , , . :

1 ?- likes(julie,X).
X = harry ;
false.

:

likes(male(X),female(Y)):-likes(X,Y).
likes(female(X),male(Y)):-likes(X,Y).
likes(X,Y):-
 ((X=julie)->
    ((hasdarkhair(Y))->
        (female(X), male(Y));
        male(X));

  ((X=julie)->
    ((isrich(Y))->
        (female(X), male(Y));
        male(X));

 ((X=mary)->
    ((hasdarkhair(Y))->
        (female(X), male(Y));
        male(X));
    female(X),male(Y))));

 ((X=john)->
    ((isrich(Y))->
        (male(X),   female(Y));
        female(X));
  ((X=john)->
    ((isblonde(Y))->
        (male(X),   female(Y));
        female(X));
 ((X=harry)->
    ((isrich(Y))->
        (male(X),   female(Y));
        female(X));
 ((X=fred)->
    ((hasbrunette(Y))->
        (male(X),   female(Y));
        female(X));
    male(X),female(Y))))).

X=Harry
X=Fred

likes(julie,fred)
true 

//

+1

:

male(john).
male(fred).
male(harry).
female(mary).
female(julie).
female(susan).
female(anne).

hasblonde(X):-(male(X),X = john);(female(X),X = susan);(female(X),X = julie).
hasdarkhair(X):-(male(X),X = harry);(male(X),X = fred).
hasbrunette(X):-(female(X),X = mary);(female(X),X = anne).

isrich(X):-(female(julie),X=julie);(male(fred),X=fred).


likes(X,Y):-((X=julie),(hasdarkhair(Y);isrich(Y)),(female(X),male(Y))).
likes(X,Y):-((X=mary),hasdarkhair(Y),female(X),male(Y)).
likes(X,Y):-((X=john),(isrich(Y);hasblonde(Y)),male(X),female(Y)).
likes(X,Y):-((X=harry),isrich(Y),male(X),female(Y)).
likes(X,Y):-((X=fred),hasbrunette(Y),male(X),female(Y)).
likes(X,Y):-((X=susan);(X=anne)),((male(X),female(Y));(female(X),male(Y))).
    ownscar(john).
love(X,Y):-likes(X,Y),likes(Y,X).

?

+1

, , (, ), (, ), , , _:

person( john  , is( male   , blonde   , poor ) , likes( female , blonde   , rich ) ) .
person( fred  , is( male   , brunette , rich ) , likes( female , brunette , _    ) ) .
person( harry , is( male   , brunette , poor ) , likes( female , _        , rich ) ) .

person( mary  , is( female , brunette , poor ) , likes( male   , brunette , _    ) ) .
person( julie , is( female , blonde   , rich ) , likes( male   , brunette , rich ) ) .
person( susan , is( female , blonde   , poor ) , likes( male   , _        , _    ) ) .
person( anne  , is( female , brunette , poor ) , likes( male   , _        , _    ) ) .

, :

likes( P1 , P2 ) :-
  person( P1 , _            , likes(G2,H2,S2) ) ,
  person( P2 , is(G2,H2,S2) , _               )
  .

If you want to show mutual attraction, you can just slightly increase this:

mutual_attraction( P1 , P2 ) :-
  person( P1 , is(G1,H1,S1) , likes(G2,H2,S2) ) ,
  person( P2 , is(G2,H2,S2) , likes(G1,H1,S1) )
  .

It also allows for flexible gender preferences - just use the anonymous variable for gender to indicate that it doesn't care.

This approach is really connected with the restriction, which is unambiguous - there is no convenient way to say, for example, that John is like red hair or blond hair, but not brown hair.

0
source

Source: https://habr.com/ru/post/1598799/


All Articles