-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtautologia.pl
100 lines (76 loc) · 2.28 KB
/
tautologia.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
:- op(30,fx,non).
:- op(100,xfy,or).
:- op(100,xfy,and).
%! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
substitute(Old,New,Old,New) :- !.
substitute(Old,New,Term,Term):-
atomic(Term),
Term \= Old.
substitute(Old,New,Term,Term1):-
\+ atomic(Term),
functor(Term,F,N),
functor(Term1,F,N),
substitute(N,Old,New,Term,Term1).
substitute(N,Old,New,Term,Term1):-
N > 0,
arg(N,Term,Arg),
substitute(Old,New,Arg,Arg1),
arg(N,Term1,Arg1),
N1 is N - 1,
substitute(N1,Old,New,Term,Term1).
substitute(0,Old,New,Term,Term1).
%! %%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
valore(f, f) :-!.
valore(v, v) :- !.
valore(non v, f) :- !. % tabella di verità del connettivo non
valore(non f, v) :- !. %
valore(v and v, v) :- !. %tabella di verità del connettivo and
valore(v and f, f) :- !. %
valore(f and v, f) :- !. %
valore(f and f, f) :- !. %
valore(v or v, v) :- !. % tabella di verità del connettivo or
valore(v or f, v) :- !. %
valore(f or v, v) :- !. %
valore(f or f, f) :- !. %
valore(non A,X) :- % determinazione del valore di verità
valore(A,A1), % della formula non A, dove A é una
valore(non A1,X). % formula proposizionale
valore(A and B,X) :- % determinazione del valore di verità
valore(A,A1), % della formula A and B, dove A e B
valore(B,B1), % sono formule proposizionali
valore(A1 and B1,X). %
valore(A or B,X) :- % determinazione del valore di verità
valore(A,A1), % della formula A or B, dove A e B
valore(B,B1), % sono formule proposizionali
valore(A1 or B1,X).
tautologia(FP):-
trovaAtomi(FP,LA),
setof(V, (
genera(LA,Sequenza),
sostituisci(LA,Sequenza,FP,V)
),
ListaValori),
controllo(ListaValori).
controllo([]).
controllo(['v'|C]):-
controllo(C).
trovaAtomi(FP,LA):-
setof(Atom,atomi(FP,Atom),LA).
atomi(Atom,Atom):-
atomic(Atom).
atomi(FP,Atom):-
\+ atomic(FP),
FP=..[Funtore|Argomenti],
member(X,Argomenti),
atomi(X,Atom).
genera([],[]).
genera([_|C],[X|Sequenza]):-
member(X,[v,f]),
genera(C,Sequenza).
sostituisci([],[],FPV,V):-
valore(FPV,V).
sostituisci([T|C],[Valore|C1],FP,V):-
substitute(T,Valore,FP,FPV1),
sostituisci(C,C1,FPV1,V).