;;; -*- Mode:LISP; Package:Puser; Base:10; Options:((World Sieve)) -*- ;;; (C) Copyright 1984,1985, Uppsala University ;;a Sieve of Eratosthenes in Prolog using Bags (define-predicate control :(options (world lazy)) ((control (bag-of ?bag ?term . ?predicates)) (lazy-bag-of ?bag ?term . ?predicates))) (define-predicate control :(options (world parallel)) ((control (bag-of ?bag ?term . ?predicates)) (prolog:eager-bag-of ?bag ?term . ?predicates))) (define-predicate print-primes ((print-primes) (primes ?primes) (map print ?primes))) (define-predicate primes ((primes ?primes) (control (bag-of ?primes ?prime (prime ?prime))))) (define-predicate prime ((prime ?prime) (control (bag-of ?ints ?int (integer-from ?int 2))) (prime ?prime ?ints)) ((prime ?prime (?prime . ?))) ((prime ?prime (?seed . ?rest)) (control (bag-of ?sifted ?not-multiple (not-multiple ?not-multiple ?seed ?rest))) (prime ?prime ?sifted))) (define-predicate integer-from ((integer-from ?i ?i)) ((integer-from ?i+ ?i) (sum ?i+1 ?i 1) (integer-from ?i+ ?i+1))) (define-predicate not-multiple ((not-multiple ?number ?seed (?number . ?)) (quotient ?q ?number ?seed) ;fixnum arithmetics (cannot-prove (product ?number ?q ?seed))) ((not-multiple ?number ?seed (? . ?numbers)) (not-multiple ?number ?seed ?numbers)))