All Downloads are FREE. Search and download functionalities are using the official Maven repository.

lib.prolog.rub Maven / Gradle / Ivy

/* A few useful logic predicates (not all from prolog) */

list_ref :: =Integer, [?x], ?x
MODES
(B,B,F) REALLY IS SEMIDET
(F,B,B) IS NONDET
END

list_ref(0,[?x|?],?x).
list_ref(?i,[?x|?r],?el) :-
	greater(?i,0), sum(?ii,1,?i), list_ref(?ii,?r,?el).

/* --------------------------------------------------------------------- */
append :: [?t], [?t], [?t]
MODES
(B,B,F) IS DET
(B,F,B) IS SEMIDET
(F,B,B) REALLY IS SEMIDET
(F,F,B) IS MULTI
END

append([],?x,?x).
append([?x|?xs],?ys,[?x|?zs]) :- append(?xs,?ys,?zs).

/* --------------------------------------------------------------------- */
member :: ?t, [?t]
MODES
(F,B) IS NONDET
END

member(?e,[?e|?r]).
member(?e,[?a|?r]) :- member(?e,?r).

/* --------------------------------------------------------------------- */
permutation :: [?t], [?t]
MODES
(F,B) IS MULTI
(B,F) IS MULTI
END

permutation([],[]).
permutation([?l|?ist],?tlsi) :-	append(?t,[?l|?si],?tlsi),
	append(?t,?si,?tsi),  permutation(?ist,?tsi).
	
selection :: [?a], [?a]
MODES
  (F,B) IS MULTI
END

selection([],?list).
selection([?l|?st],[?l|?ist]) :- selection(?st,?ist). 
selection(?st,[?l|?ist]) :- selection(?st,?ist). 

/* --------------------------------------------------------------------- */
reverse :: [?t], [?t]
MODES
(BOUND, FREE) IS DET
(FREE, BOUND) IS DET
END

reverse([],[]).
reverse([?l|?ist],?tsil) 
 :- BOUND ?ist  : reverse(?ist,?tsi), append(?tsi,[?l],?tsil)
  | BOUND ?tsil : reverse(?tsil,[?l|?ist]).

/* --------------------------------------------------------------------- */
equals :: ?a, ?a
MODES
(F,B) IS DET
(B,F) IS DET
END

equals(?x,?x).

zip :: [?a], [?b], []
MODES
(F,F,B) IS DET
(B,B,F) IS SEMIDET
END

zip([],[],[]).
zip([?a|?as],[?x|?xs],[|?axs]) :- zip(?as,?xs,?axs). 

/* ------------------------------------------------------------ */

sumList :: [=Integer], =Integer
MODES
  (B,F) IS DET
END

sumList([],0).
sumList([?x|?xs],?sum) :-
   sumList(?xs,?restsum),sum(?x,?restsum,?sum).
   
/* ------------------------------------------------------------- */

false :: ()
MODES () IS SEMIDET END  // Maybe we should have a "fail" mode?

true :: ()
MODES () IS DET END
true().
 




© 2015 - 2025 Weber Informatics LLC | Privacy Policy