mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| %%----- normalize(+Wff,-NormalClauses) ------
 | |
| normalize(Wff,NormalClauses) :-
 | |
|    conVert(Wff,[],S),
 | |
|    cnF(S,T),
 | |
|    flatten_and(T,U),
 | |
|    make_clauses(U,NormalClauses).
 | |
| 
 | |
| %%-----  make a sequence out of a conjunction -----
 | |
| flatten_and(X /\ Y, F) :-
 | |
|    !,
 | |
|    flatten_and(X,A),
 | |
|    flatten_and(Y, B),
 | |
|    sequence_append(A,B,F).
 | |
| flatten_and(X,X).
 | |
| 
 | |
| %%-----  make a sequence out of a disjunction -----
 | |
| flatten_or(X \/ Y, F) :-
 | |
|    !,
 | |
|    flatten_or(X,A),
 | |
|    flatten_or(Y,B),
 | |
|    sequence_append(A,B,F).
 | |
| flatten_or(X,X).
 | |
| 
 | |
| 
 | |
| %%----- append two sequences -------------------------------
 | |
| sequence_append((X,R),S,(X,T)) :- !, sequence_append(R,S,T).
 | |
| sequence_append((X),S,(X,S)).
 | |
| 
 | |
| %%----- separate into positive and negative literals -----------
 | |
| separate((A,B),P,N) :-
 | |
|    !,
 | |
|    (A = ~X -> N=[X|N1],
 | |
|                separate(B,P,N1)
 | |
|              ;
 | |
|                P=[A|P1],
 | |
|                separate(B,P1,N) ).
 | |
| separate(A,P,N) :-
 | |
|    (A = ~X -> N=[X],
 | |
|                P = []
 | |
|             ;
 | |
|                P=[A],
 | |
|                N = [] ).
 | |
| 
 | |
| %%----- tautology ----------------------------
 | |
| tautology(P,N) :- some_occurs(N,P).
 | |
| 
 | |
| some_occurs([F|R],B) :-
 | |
|    occurs(F,B) | some_occurs(R,B).
 | |
| 
 | |
| occurs(A,[F|_]) :-
 | |
|    A == F,
 | |
|    !.
 | |
| occurs(A,[_|R]) :-
 | |
|    occurs(A,R).
 | |
| 
 | |
| make_clauses((A,B),C) :-
 | |
|    !,
 | |
|    flatten_or(A,F),
 | |
|    separate(F,P,N),
 | |
|    (tautology(P,N) ->
 | |
|       make_clauses(B,C)
 | |
|           ;
 | |
|       make_clause(P,N,D),
 | |
|       C = [D|R],
 | |
|       make_clauses(B,R) ).
 | |
| make_clauses(A,C) :-
 | |
|    flatten_or(A,F),
 | |
|    separate(F,P,N),
 | |
|    (tautology(P,N) ->
 | |
|        C = []
 | |
|         ;
 | |
|        make_clause(P,N,D),
 | |
|        C = [D] ).
 | |
| 
 | |
| make_clause([],N, false :- B) :-
 | |
|    !,
 | |
|    make_sequence(N,B,',').
 | |
| make_clause(P,[],H) :-
 | |
|    !,
 | |
|    make_sequence(P,H,'|').
 | |
| make_clause(P,N, H :- T) :-
 | |
|    make_sequence(P,H,'|'),
 | |
|    make_sequence(N,T,',').
 | |
| 
 | |
| make_sequence([A],A,_) :- !.
 | |
| make_sequence([F|R],(F|S),'|') :-
 | |
|    make_sequence(R,S,'|').
 | |
| make_sequence([F|R],(F,S),',') :-
 | |
|    make_sequence(R,S,',').
 | |
| 
 | |
| write_list([F|R]) :-
 | |
|    write(F), write('.'), nl,
 | |
|    write_list(R).
 | |
| write_list([]).
 |