PROLOG/ SYSTEM

0

Witam
Mam pytanie bo na zaliczenie przedmiotu miałem zrobić system ekspertowy w PROLOGu i napisałem kod tego systemu, który ma za zadanie ułatwić obsługę studentów pracownikom dziekanatu, który jest następujący :

%DEKLAROWANIE:
prawda([choroba,zaplacony_warunek_A]).
wykluczenia([]).
oceny(2,2,2).


jest(X):- prawda(Z), element(X,Z).

true(X):- jest(X), \+blad.
true(X):- rule(X,[]),\+blad.
true(X) :- rule(X,Y), spelnione(Y), \+blad.
true(pozytywne_A):- oceny(A,_,_), A>2.
true(negatywne_A):- oceny(A,_,_), A=2.
true(pozytywne_B):- oceny(_,B,_), B>2.
true(negatywne_B):- oceny(_,B,_), B=2.
true(pozytywne_C):- oceny(_,_,C), C>2.
true(negatywne_C):- oceny(_,_,C), C=2.
true(dobra_srednia_do_stypendium):- oceny(A,B,C), S is (A+B+C)/3, S >= (9/2).

true([H|T]):-
    atom_prefix(H,n_), atom_length(H,P1),
    P2 is P1-2,sub_atom(H,2,P2,_,X),false(X),true(O).

spelnione([X]):- true(X), \+blad.
spelnione([G|O]):- true(G), spelnione(O), \+blad.
element(X,[X|_]).
element(X,[_|O]):- element(X,O).  

false(X) :- \+true(X).
false(X):- jest(Z), wykluczenia(T), element(X,T), element(Z,T), \+jest(X).

%BAZA REGUŁ
rule(zaliczony_semestr,[warunek_B,zaliczone_A,zaliczone_C]).
rule(zaliczony_semestr,[warunek_C,zaliczone_A,zaliczone_B]).
rule(stypendium,[dobra_srednia_do_stypendium]).
rule(wpis_na_nowy_semestr,[zaliczony_semestr]).
rule(zaliczone_A,[pozytywne_A]).
rule(zaliczone_B,[pozytywne_B]).
rule(zaliczone_C,[pozytywne_C]).
rule(zaliczony_semestr,[zaliczone_A,zaliczone_B,zaliczone_C]).
rule(zaliczony_semestr,[warunek_A,zaliczone_B,zaliczone_C]).
rule(zwolnienie_z_oplaty,[choroba]).
rule(zwolnienie_z_oplaty,[osiagniecia_sportowe]).
rule(n_zaliczone_A,[negatywne_A]).
rule(n_zaliczone_B,[negatywne_B]).
rule(n_zaliczone_C,[negatywne_C]).
rule(warunek,[n_zaliczone_A,zaplacony_warunek_A,zaliczone_B,zaliczone_C,brak_warunku_starego_z_A]).
rule(warunek,[n_zaliczone_B,zaplacony_warunek_B,zaliczone_A,zaliczone_C,brak_warunku_starego_z_B]).
rule(warunek,[n_zaliczone_C,zaplacony_warunek_C,zaliczone_B,zaliczone_A,brak_warunku_starego_z_C]).
rule(warunek,[n_zaliczone_A,zwolnienie_z_oplaty,zaliczone_B,zaliczone_C,brak_warunku_starego_z_A]).
rule(warunek,[n_zaliczone_B,zwolnienie_z_oplaty,zaliczone_A,zaliczone_C,brak_warunku_starego_z_B]).
rule(warunek,[n_zaliczone_C,zwolnienie_z_oplaty,zaliczone_B,zaliczone_A,brak_warunku_starego_z_C]).
rule(brak_wpisu,[n_zaliczone_C,n_zaliczone_A,n_zaliczone_B]).
rule(brak_wpisu,[n_zaliczone_A,n_zaliczone_B,zaliczone_C]).
rule(brak_wpisu,[zaliczone_A,n_zaliczone_B,n_zaliczone_C]).
rule(brak_wpisu,[n_zaliczone_A,zaliczone_B,n_zaliczone_C]).
blad:- jest(Z), wykluczenia(T), element(X,T), element(Z,T), jest(X), X \= Z.

Niestety wywołując funkcję jest(X). wywołuje mi tylko to co jest zadeklarowane w prawda nie sprawdza już na podstawie ocen czy zaliczone czy nie :/
Będę wdzięczny za pomoc :)

0

Jakiego używasz prologa? Na SWI-PROLOG 6.6.6 wygląda tak:

?- jest(X).
X = choroba ;
X = zaplacony_warunek_A ;
false.

(średniki wciskam oczywiście sam) i to jest dokładnie to, czego się spodziewam. Jak ma sprawdzać coś więcej, skoro jest odowłuje się tylko do prawda i do element?

Co być chciał, żeby wyszło?

PS. Nazwy predykatów pozostawiają (moim zdaniem) wiele do życzenia...

0

false(X) :- +true(X).

nie używając formuły z sub-atomem, jak najprościej zdefiniować false zgodnie z powyższym, żeby się nie zapętlało?

1 użytkowników online, w tym zalogowanych: 0, gości: 1