First -- here's the definitive source:
ftp://ftp.cs.utexas.edu/pub/ops5-benchmark-suite
But the "manners" version isn't in Jess syntax. Attached see my
translations of the program and the data generator.
I think peter wrote:
>
> I tried to google for a clips version of manners
> benchmark for Jess. Would anyone have a pointer to it?
> I did a search for temple university clips manners
> benchmark, but the URL is no longer available.
>
> thanks in advance.
>
---------------------------------------------------------
Ernest Friedman-Hill
Distributed Systems Research Phone: (925) 294-2154
Sandia National Labs FAX: (925) 294-2234
PO Box 969, MS 9012 [EMAIL PROTECTED]
Livermore, CA 94550 http://herzberg.ca.sandia.gov
;; Deftemplates
(deftemplate guest (slot name) (slot sex) (slot hobby))
(deftemplate last_seat (slot seat))
(deftemplate seating
(slot id) (slot pid) (slot seat1) (slot name1) (slot name2) (slot seat2) (slot
path_done))
(deftemplate path (slot id) (slot name) (slot seat))
(deftemplate chosen (slot id) (slot name) (slot hobby))
(deftemplate count (slot c))
(deftemplate context (slot state))
(defrule assign_first_seat
?ctxt <- (context (state start))
(guest (name ?n))
?count <- (count (c ?c))
=>
(assert (seating (seat1 1) (name1 ?n) (name2 ?n) (seat2 1) (id ?c) (pid 0)
(path_done yes)))
(assert (path (id ?c) (name ?n) (seat 1)))
(modify ?count (c (+ ?c 1)))
(printout t seat " " 1 " " ?n " " ?n " " 1 " " ?c " " 0 " " 1 crlf)
(modify ?ctxt (state assign_seats)))
(defrule find_seating
?ctxt <- (context (state assign_seats))
(seating (seat1 ?seat1) (seat2 ?seat2) (name2 ?n2) (id ?id) (pid ?pid) (path_done
yes))
(guest (name ?n2) (sex ?s1) (hobby ?h1))
(guest (name ?g2) (sex ~?s1) (hobby ?h1))
?count <- (count (c ?c))
(not (path (id ?id) (name ?g2)))
(not (chosen (id ?id) (name ?g2) (hobby ?h1)))
=>
(assert (seating (seat1 ?seat2) (name1 ?n2) (name2 ?g2) (seat2 (+ ?seat2 1)) (id ?c)
(pid ?id) (path_done no)))
(assert (path (id ?c) (name ?g2) (seat ( + ?seat2 1))))
(assert (chosen (id ?id) (name ?g2) (hobby ?h1)))
(modify ?count (c (+ ?c 1)))
(printout t seat " " ?seat2 " " ?n2 " " ?g2 crlf)
(modify ?ctxt (state make_path)))
(defrule path_done
?ctxt <- (context (state make_path))
?seat <- (seating (path_done no))
=>
(modify ?seat (path_done yes))
(modify ?ctxt (state check_done)))
(defrule make_path
(context (state make_path))
(seating (id ?id) (pid ?pid) (path_done no))
(path (id ?pid)(name ?n1) (seat ?s))
(not (path (id ?id) (name ?n1)))
=>
(assert (path (id ?id) (name ?n1) (seat ?s))))
(defrule continue
?ctxt <- (context (state check_done))
=>
(modify ?ctxt (state assign_seats)))
(defrule are_we_done
?ctxt <- (context (state check_done))
(last_seat (seat ?l_seat))
(seating (seat2 ?l_seat))
=>
(printout t crlf "Yes, we are done!!" crlf)
(modify ?ctxt (state print_results))
)
(defrule print_results
(context (state print_results))
(seating (id ?id) (seat2 ?s2))
(last_seat (seat ?s2))
?path <- (path (id ?id) (name ?n) (seat ?s))
=>
(retract ?path)
(printout t ?n " " ?s crlf))
(defrule all_done
(context (state print_results))
=>
(halt))
(set-reset-globals t)
(defglobal ?*t* = (time))
(reset)
(batch "mann90.dat")
;; (watch rules)
;;(printout t (run) crlf)
(run)
(printout t "Elapsed time: " (- (time) ?*t*) crlf)
;; (exit)
#include <stdio.h>
#include <math.h>
/****************************************************************
Tim Grose
January 29, 1991
Miss Manners Data Generator
The purpose of this program is to generate a file of make
statements that can be used as an input data set for the
Miss Manners OPS5c program.
All input to this program will be interactively obtained from
the user. The file of make statements will be written to
file manners.dat.
The user specifies how many guests there will be. Each guest's
name will be a unique integer. Each guest is assigned a sex at
random. The user can specify the total number of hobbies it is
possible for a guest to have, and a lower limit of the number
of hobbies for a guest. For instance, if the user chooses 10
hobbies and a lower limit of 3 hobbies, each guest will have
between 3 and 10 hobbies. The hobbies will be designated with
an integer. Finally, the user can specify the number of seats
available.
The sex of the guests is assigned so that approximately half of
the guests are male and half are female.
*****************************************************************/
main()
{
FILE *fopen(), *output_file;
int seed, max_hobby, min_hobby, guest_num, seat_num, max_male, max_female;
int chosen_hobby, count, number, rand_num, hobby_num, hobby_count;
int hobbies[100], male_count, female_count;
char sex,fname[20];
float num;
printf("Miss Manners Data Generator\n\n");
printf("How many guests will there be? ");
scanf("%d",&guest_num);
strcpy(fname,"mann");
sprintf(&fname[4],"%d",guest_num);
strcat(fname,".dat");
output_file = fopen(fname,"w");
if (output_file == NULL)
{
write("\n\nError opening output file\n");
exit(20);
}
printf("How many seats are there? ");
scanf("%d", &seat_num);
printf("What is the maximum number of hobbies? ");
scanf("%d", &max_hobby);
printf("What is the minimum number of hobbies? ");
scanf("%d", &min_hobby);
seed = 10;
srand(seed);
male_count = 0;
female_count = 0;
max_male = guest_num / 2;
max_female = guest_num - max_male;
/****************************************************************/
/* For each guest, assign a sex and the hobbies for that guest. */
/****************************************************************/
for(count = 1; count <= guest_num; ++count)
{
rand_num = rand();
if (rand_num < 1073741824)
sex = 'm';
else
sex = 'f';
if ((sex == 'm') && (male_count == max_male))
sex = 'f';
if ((sex == 'f') && (female_count == max_female))
sex = 'm';
if (sex == 'm')
male_count = male_count + 1;
if (sex == 'f')
female_count = female_count + 1;
for(hobby_count = 1; hobby_count <= max_hobby; ++hobby_count)
hobbies[hobby_count-1] = -1;
/************************************************************/
/* Determine the number of hobbies for this guest, then */
/* choose them. */
/************************************************************/
rand_num = rand();
num = (float) rand_num / 2147483647.0;
hobby_num = (float) min_hobby + num * (float) (max_hobby-min_hobby+1);
for(hobby_count=1; hobby_count <= hobby_num; ++hobby_count)
{
do
{
rand_num = rand();
num = (float) rand_num / 2147483647.0;
chosen_hobby = 1.0 + num * (float) max_hobby;
}
while(hobbies[chosen_hobby - 1] != -1);
hobbies[chosen_hobby - 1] = chosen_hobby;
fprintf(output_file, "(assert (guest (name %d) (sex %c) (hobby %d)))\n",
count, sex, chosen_hobby);
}
}
fprintf(output_file, "(assert (last_seat (seat %d)))\n", seat_num);
fprintf(output_file, "(assert (count (c 1)))\n");
fprintf(output_file, "(assert (context (state start)))\n");
}