From 4824b9ef22fa746a03f50bba358c216044d151f3 Mon Sep 17 00:00:00 2001 From: Mario Wenzel <maweki@gmail.com> Date: Mon, 11 Jun 2018 15:29:58 +0200 Subject: [PATCH] swipl benchmark --- db/bench_db.sql | 11 + swipl/dblp.pl | 132 ++ swipl/j1axy_a.pl | 135 ++ swipl/j1axy_all.pl | 140 ++ swipl/j1axy_none.pl | 136 ++ swipl/run_bench | 80 + swipl/run_bench_list | 105 + swipl/tcbf.pl | 138 ++ swipl/tcbf_sldmag.pl | 147 ++ swipl/tcff.pl | 138 ++ swipl/wine.pl | 5395 ++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 6557 insertions(+) create mode 100644 swipl/dblp.pl create mode 100644 swipl/j1axy_a.pl create mode 100644 swipl/j1axy_all.pl create mode 100644 swipl/j1axy_none.pl create mode 100755 swipl/run_bench create mode 100755 swipl/run_bench_list create mode 100644 swipl/tcbf.pl create mode 100644 swipl/tcbf_sldmag.pl create mode 100644 swipl/tcff.pl create mode 100644 swipl/wine.pl diff --git a/db/bench_db.sql b/db/bench_db.sql index 33b8cd1..dfef149 100644 --- a/db/bench_db.sql +++ b/db/bench_db.sql @@ -208,6 +208,11 @@ INSERT INTO PROGRAMS VALUES ( 'http://hsqldb.org/', NULL); +INSERT INTO PROGRAMS VALUES ( + 'swipl', 9, 'SWI-Prolog', + 'http://www.swi-prolog.org/', + NULL); + -- ============================================================================ -- Table for Installed Program Versions on Machines: -- ============================================================================ @@ -323,6 +328,12 @@ INSERT INTO PROG_VER VALUES ( 'C', NULL); +INSERT INTO PROG_VER VALUES ( + 'swipl', 1, 'dbs1', + '7.7.15', ' (x86_64-linux)', '2018-06-01', + '', + 'C', + NULL); -- ============================================================================ -- Table for Tests (A Benchmark Executed by a Program with Specific Options): diff --git a/swipl/dblp.pl b/swipl/dblp.pl new file mode 100644 index 0000000..69c5834 --- /dev/null +++ b/swipl/dblp.pl @@ -0,0 +1,132 @@ +/*============================================================================= + * DBLP Benchmark. Self-Join and Selection for Entity-Attribute-Value-Table. + * + * Benchmark IDs: dblp_* + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + + +/* ---------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ + +% nothing special. + +/* ---------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + +queryrule(X,T,Y,A,M) :- + att(X,title,T), + att(X,year,Y), + att(X,author,A), + att(X,month,M). + +/* ---------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- queryrule(_,_,_,_,_), fail. +bench. + +/* ---------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(dblp_bench, '../data/dblp.data'). +test_file(dblp_big, '../data/dblp_big.data'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). diff --git a/swipl/j1axy_a.pl b/swipl/j1axy_a.pl new file mode 100644 index 0000000..9cff469 --- /dev/null +++ b/swipl/j1axy_a.pl @@ -0,0 +1,135 @@ +/*============================================================================= + * Tree structure join operation: Join1 Benchmark with Query a(X,Y). + * + * Benchmark IDs: j1axy_a_* + * This version tables the result predicate a. + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + +/* ---------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ + +:- use_module(library(tabling)). +:- table(a/2). + +/* ---------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + +a(X, Y) :- b1(X, Z), b2(Z, Y). + +b1(X, Y) :- c1(X, Z), c2(Z, Y). +b2(X, Y) :- c3(X, Z), c4(Z, Y). + +c1(X, Y) :- d1(X, Z), d2(Z, Y). + +/* ---------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- a(_,_), fail. +bench. + +/* ---------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(j1axy_a_10k, '../data/d1000_relsize10000_xsb_cyc.P'). +test_file(j1axy_a_50k, '../data/d1000_relsize50000_xsb_cyc.P'). +test_file(j1axy_a_250k, '../data/d1000_relsize250000_xsb_cyc.P'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). diff --git a/swipl/j1axy_all.pl b/swipl/j1axy_all.pl new file mode 100644 index 0000000..e6153ff --- /dev/null +++ b/swipl/j1axy_all.pl @@ -0,0 +1,140 @@ +/*============================================================================= + * Tree structure join operation: Join1 Benchmark with Query a(X,Y). + * + * Benchmark IDs: j1axy_all_* + * This version tables all derived predicates. + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + + +/* ---------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ + +:- use_module(library(tabling)). +:- table(a/2). +:- table(b1/2). +:- table(b2/2). +:- table(c1/2). + +/* ---------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + + +a(X, Y) :- b1(X, Z), b2(Z, Y). + +b1(X, Y) :- c1(X, Z), c2(Z, Y). +b2(X, Y) :- c3(X, Z), c4(Z, Y). + +c1(X, Y) :- d1(X, Z), d2(Z, Y). + +/* ---------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- a(_,_), fail. +bench. + +/* ---------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(j1axy_all_10k, '../data/d1000_relsize10000_xsb_cyc.P'). +test_file(j1axy_all_50k, '../data/d1000_relsize50000_xsb_cyc.P'). +test_file(j1axy_all_250k, '../data/d1000_relsize250000_xsb_cyc.P'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). diff --git a/swipl/j1axy_none.pl b/swipl/j1axy_none.pl new file mode 100644 index 0000000..c5c6da7 --- /dev/null +++ b/swipl/j1axy_none.pl @@ -0,0 +1,136 @@ +/*============================================================================= + * Tree structure join operation: Join1 Benchmark with Query a(X,Y). + * + * Benchmark IDs: j1axy_none_* + * This version works without tabling. It computes many duplicates. + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + + +/* ---------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ + +% :- table(a/2). + +/* ---------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + + +a(X, Y) :- b1(X, Z), b2(Z, Y). + +b1(X, Y) :- c1(X, Z), c2(Z, Y). +b2(X, Y) :- c3(X, Z), c4(Z, Y). + +c1(X, Y) :- d1(X, Z), d2(Z, Y). + +/* ---------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- a(_,_), fail. +bench. + +/* ---------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(j1axy_none_10k, '../data/d1000_relsize10000_xsb_cyc.P'). +test_file(j1axy_none_50k, '../data/d1000_relsize50000_xsb_cyc.P'). +test_file(j1axy_none_250k, '../data/d1000_relsize250000_xsb_cyc.P'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). diff --git a/swipl/run_bench b/swipl/run_bench new file mode 100755 index 0000000..8e5a628 --- /dev/null +++ b/swipl/run_bench @@ -0,0 +1,80 @@ +#!/bin/bash +#============================================================================== +# Project: Deductive Database +# Filename: yap/run_bench_list +# Purpose: Execute a benchmark for YAP, measure time and memory +# Last Change: 11.06.2018 +# Language: Shellscript (bash) +# Author: Stefan Brass +# EMail: brass@informatik.uni-halle.de +# WWW: http://www.informatik.uni-halle.de/~brass/ +# Address: Feldschloesschen 15, D-06120 Halle (Saale), GERMANY +# Note: There is no warranty at all - this code may contain bugs. +# Copyright: The benchmarks are from the OpenRuleBench. Ask the authors. +# The shellscripts and the result database are from me. +# You can use them as you wish, but don't make me responsible! +# I would be interested to hear about improved versions. +#============================================================================== + + +# This script executes a benchmark (version for YAProlog). +# It must be called with two or three command line arguments: +# 1. The output file, to which the result line will be appended +# 2. a test ID +# 3. optionally a number of iterations + +# Check number of arguments: +if [ "$#" -ne 2 ] && [ "$#" -ne 3 ] +then + echo "Usage: $0 File TestID [Iterations]" >&2 + exit 1 +fi + +# Check number of iterations. If none specified, the number is 1: +DIGITS="[0-9]+" +if [ "$#" -eq 3 ] +then + case "$3" in + *[^0-9]*) + echo "Second argument (iterations) must be numeric!" + exit 2 ;; + *) + ITER="$3" ;; + esac +else + ITER=1 +fi + +# Find Test Program: +case "$2" in + dblp_*) PROG=dblp.pl ;; + j1axy_none_*) PROG=j1axy_none.pl ;; + j1axy_a_*) PROG=j1axy_a.pl ;; + j1axy_all_*) PROG=j1axy_all.pl ;; + tcff_tab_*) PROG=tcff.pl ;; + tcbf_tab_*) PROG=tcbf.pl ;; + tcbf_sldmag_*) PROG=tcbf_sldmag.pl ;; + wine_table) PROG=wine.pl ;; + *) echo "UNKNOWN TEST!"; exit 2 ;; +esac + +# Print empty line to separate benchmarks: +echo + +# Loop for number of iterations: +for i in `seq 1 $ITER` +do + echo -n "$2 - Iteration $i/$ITER, Start: " + date + +# This writes the file RUN_BENCH__RESULT. +# In addition we call /usr/bin/time and let it write to RUN_BENCH__TIME: + /usr/bin/time -f "%U\t%S\t%E\t%M" -o RUN_BENCH__TIME \ + swipl -l $PROG -g go -g halt -- $2 + + # Finally, the two result files are combined to one line + # in the output file (First Parameter): + cat RUN_BENCH__RESULT RUN_BENCH__TIME >>$1 + +# End of loop: +done diff --git a/swipl/run_bench_list b/swipl/run_bench_list new file mode 100755 index 0000000..6d032dd --- /dev/null +++ b/swipl/run_bench_list @@ -0,0 +1,105 @@ +#!/bin/bash +#============================================================================== +# Project: Deductive Database +# Filename: yap/run_bench_list +# Purpose: Execute all benchmarks for YAP +# Last Change: 11.05.2018 +# Language: Shellscript (bash) +# Author: Stefan Brass +# EMail: brass@informatik.uni-halle.de +# WWW: http://www.informatik.uni-halle.de/~brass/ +# Address: Feldschloesschen 15, D-06120 Halle (Saale), GERMANY +# Note: There is no warranty at all - this code may contain bugs. +# Copyright: The benchmarks are from the OpenRuleBench. Ask the authors. +# The shellscripts and the result database are from me. +# You can use them as you wish, but don't make me responsible! +# I would be interested to hear about improved versions. +#============================================================================== + + +# Compose File Name for Results: +PROG=swipl +VER=1 # Version number 1 is SWI-Prolog version 7.6.4 (x86_64-linux) +FILE="$PROG"_"$VER"_`uname -n`_`date +%Y_%m_%d.tsv` + +# Print empty line to separate output from command line: +echo + +# Check whether file exists, create headline with column values: +if [ -f $FILE ]; then + echo "$FILE exists already. Benchmark Results will be appended." +else + # "Benchmark started at: " + echo "Output file is: $FILE" + echo -n "Benchmark_ID Load Exec Total Status " >$FILE + echo "User System Real Mem" >>$FILE +fi + +# Print Current Date and Time (for Total Runtime of All Benchmarks): +echo -n "Benchmark started at: " +date + +# ----------------------------------------------------------------------------- +# List of Benchmarks to Execute: +# ----------------------------------------------------------------------------- + +# The runtime on bach for all these tests was slightly more than 7 hours. +# The longest was j1axy_a_50k with 3 hours. + +./run_bench $FILE dblp_bench 10 + +./run_bench $FILE j1axy_none_10k 10 +./run_bench $FILE j1axy_none_50k 1 +#./run_bench $FILE j1axy_taba_250k 1 + +./run_bench $FILE j1axy_a_10k 10 +./run_bench $FILE j1axy_a_50k 1 +#./run_bench $FILE j1axy_a_250k 1 + +./run_bench $FILE j1axy_all_10k 10 +./run_bench $FILE j1axy_all_50k 3 +./run_bench $FILE j1axy_all_250k 3 + +./run_bench $FILE tcff_tab_f1 10 +./run_bench $FILE tcff_tab_f2 10 +./run_bench $FILE tcff_tab_f3 10 +./run_bench $FILE tcff_tab_f4 10 +./run_bench $FILE tcff_tab_f5 10 +./run_bench $FILE tcff_tab_f6 10 +./run_bench $FILE tcff_tab_f7 10 +./run_bench $FILE tcff_tab_f8 10 +./run_bench $FILE tcff_tab_f9 10 +./run_bench $FILE tcff_tab_f10 10 + +./run_bench $FILE tcbf_tab_f1 10 +./run_bench $FILE tcbf_tab_f2 10 +./run_bench $FILE tcbf_tab_f3 10 +./run_bench $FILE tcbf_tab_f4 10 +./run_bench $FILE tcbf_tab_f5 10 +./run_bench $FILE tcbf_tab_f6 10 +./run_bench $FILE tcbf_tab_f7 10 +./run_bench $FILE tcbf_tab_f8 10 +./run_bench $FILE tcbf_tab_f9 10 +./run_bench $FILE tcbf_tab_f10 10 + +./run_bench $FILE tcbf_sldmag_f1 10 +./run_bench $FILE tcbf_sldmag_f2 10 +./run_bench $FILE tcbf_sldmag_f3 10 +./run_bench $FILE tcbf_sldmag_f4 10 +./run_bench $FILE tcbf_sldmag_f5 10 +./run_bench $FILE tcbf_sldmag_f6 10 +./run_bench $FILE tcbf_sldmag_f7 10 +./run_bench $FILE tcbf_sldmag_f8 10 +./run_bench $FILE tcbf_sldmag_f9 10 +./run_bench $FILE tcbf_sldmag_f10 10 + +./run_bench $FILE wine_table 10 + +# Clean Temporary Files: +rm -f RUN_BENCH__RESULT +rm -f RUN_BENCH__TIME + +# Print Current Date and Time (for Total Runtime of All Benchmarks): +echo +echo -n "Benchmark finished at: " +date diff --git a/swipl/tcbf.pl b/swipl/tcbf.pl new file mode 100644 index 0000000..feca060 --- /dev/null +++ b/swipl/tcbf.pl @@ -0,0 +1,138 @@ +/*============================================================================= + * Tansitive closure program. Query results with given first argument (bf). + * + * Benchmark IDs: tcbf_tab_* + * This version tables the predicate tc to ensure termination for cyclic data. + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + +/*----------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ + +:- use_module(library(tabling)). +:- table(tc/2). + +/*----------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + +tc(X,Y) :- par(X,Y). +tc(X,Y) :- par(X,Z), tc(Z,Y). + +/*----------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- tc(1,_), fail. +bench. + +/*----------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(tcbf_tab_f1, '../data/tc_d1000_parsize50000_xsb_nocyc.P'). +test_file(tcbf_tab_f2, '../data/tc_d1000_parsize50000_xsb_cyc.P'). +test_file(tcbf_tab_f3, '../data/tc_d1000_parsize250000_xsb_nocyc.P'). +test_file(tcbf_tab_f4, '../data/tc_d1000_parsize250000_xsb_cyc.P'). +test_file(tcbf_tab_f5, '../data/tc_d1000_parsize500000_xsb_nocyc.P'). +test_file(tcbf_tab_f6, '../data/tc_d1000_parsize500000_xsb_cyc.P'). +test_file(tcbf_tab_f7, '../data/tc_d2000_parsize500000_xsb_nocyc.P'). +test_file(tcbf_tab_f8, '../data/tc_d2000_parsize500000_xsb_cyc.P'). +test_file(tcbf_tab_f9, '../data/tc_d2000_parsize1000000_xsb_nocyc.P'). +test_file(tcbf_tab_f10, '../data/tc_d2000_parsize1000000_xsb_cyc.P'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). diff --git a/swipl/tcbf_sldmag.pl b/swipl/tcbf_sldmag.pl new file mode 100644 index 0000000..a9c9fbf --- /dev/null +++ b/swipl/tcbf_sldmag.pl @@ -0,0 +1,147 @@ +/*============================================================================= + * Tansitive closure program. Query results with given first argument (bf). + * + * Benchmark IDs: tcbf_sldmag_* + * This version uses the SLDMagic transformation and tables all predicates. + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + +/*----------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ + +:- use_module(library(tabling)). +:- table(p0/1). +:- table(p1/1). +:- table(tc/2). + +/*----------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + +% tc(X,Y) :- par(X,Y). +% tc(X,Y) :- par(X,Z), tc(Z,Y). + +% Result of the SLDMagic Transformation: +p1(A) :- p1(B), par(B,A). +p1(A) :- par(1,A). +p0(A) :- p1(B), par(B,A). +p0(A) :- par(1,A). +tc(1,A) :- p0(A). + +/*----------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- tc(1,_), fail. +bench. + +/*----------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(tcbf_sldmag_f1, '../data/tc_d1000_parsize50000_xsb_nocyc.P'). +test_file(tcbf_sldmag_f2, '../data/tc_d1000_parsize50000_xsb_cyc.P'). +test_file(tcbf_sldmag_f3, '../data/tc_d1000_parsize250000_xsb_nocyc.P'). +test_file(tcbf_sldmag_f4, '../data/tc_d1000_parsize250000_xsb_cyc.P'). +test_file(tcbf_sldmag_f5, '../data/tc_d1000_parsize500000_xsb_nocyc.P'). +test_file(tcbf_sldmag_f6, '../data/tc_d1000_parsize500000_xsb_cyc.P'). +test_file(tcbf_sldmag_f7, '../data/tc_d2000_parsize500000_xsb_nocyc.P'). +test_file(tcbf_sldmag_f8, '../data/tc_d2000_parsize500000_xsb_cyc.P'). +test_file(tcbf_sldmag_f9, '../data/tc_d2000_parsize1000000_xsb_nocyc.P'). +test_file(tcbf_sldmag_f10, '../data/tc_d2000_parsize1000000_xsb_cyc.P'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). diff --git a/swipl/tcff.pl b/swipl/tcff.pl new file mode 100644 index 0000000..0f9c416 --- /dev/null +++ b/swipl/tcff.pl @@ -0,0 +1,138 @@ +/*============================================================================= + * Tansitive closure program. Query all results (both arguments free). + * + * Benchmark IDs: tcff_tab_* + * This version tables the predicate tc to ensure termination for cyclic data. + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + +/*----------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ + +:- use_module(library(tabling)). +:- table(tc/2). + +/*----------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + +tc(X,Y) :- par(X,Y). +tc(X,Y) :- par(X,Z), tc(Z,Y). + +/*----------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- tc(_,_), fail. +bench. + +/*----------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(tcff_tab_f1, '../data/tc_d1000_parsize50000_xsb_nocyc.P'). +test_file(tcff_tab_f2, '../data/tc_d1000_parsize50000_xsb_cyc.P'). +test_file(tcff_tab_f3, '../data/tc_d1000_parsize250000_xsb_nocyc.P'). +test_file(tcff_tab_f4, '../data/tc_d1000_parsize250000_xsb_cyc.P'). +test_file(tcff_tab_f5, '../data/tc_d1000_parsize500000_xsb_nocyc.P'). +test_file(tcff_tab_f6, '../data/tc_d1000_parsize500000_xsb_cyc.P'). +test_file(tcff_tab_f7, '../data/tc_d2000_parsize500000_xsb_nocyc.P'). +test_file(tcff_tab_f8, '../data/tc_d2000_parsize500000_xsb_cyc.P'). +test_file(tcff_tab_f9, '../data/tc_d2000_parsize1000000_xsb_nocyc.P'). +test_file(tcff_tab_f10, '../data/tc_d2000_parsize1000000_xsb_cyc.P'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). diff --git a/swipl/wine.pl b/swipl/wine.pl new file mode 100644 index 0000000..52a98ac --- /dev/null +++ b/swipl/wine.pl @@ -0,0 +1,5395 @@ +/*============================================================================= + * Wine Ontology Benchmark. Many mutually recursive predicates, many rules. + * + * Benchmark IDs: wine_table + * + * Test results will be recorded in file 'RUN_BENCH__RESULT' + * This file is a modified version of a file distributed with OpenRuleBench. + *============================================================================= + */ + + +/* ---------------------------------------------------------------------------- + * Options: + *----------------------------------------------------------------------------- + */ +:- use_module(library(tabling)). +:-table alsatianwine/1, + americanwine/1, + bordeaux/1, + burgundy/1, + anjou/1, + beaujolais/1, + cabernetfranc/1, + cabernetsauvignon/1, + californiawine/1, + chardonnay/1, + cheninblanc/1, + chianti/1, + cotesdor/1, + dessertwine/1, + dryriesling/1, + dryredwine/1, + drywhitewine/1, + drywine/1, + earlyharvest/1, + frenchwine/1, + fullbodiedwine/1, + gamay/1, + germanwine/1, + grape/1, + icewine/1, + italianwine/1, + lateharvest/1, + loire/1, + margaux/1, + medoc/1, + meritage/1, + merlot/1, + meursault/1, + muscadet/1, + pauillac/1, + petitesyrah/1, + pinotblanc/1, + pinotnoir/1, + port/1, + potableliquid/1, + redbordeaux/1, + redburgundy/1, + redtablewine/1, + redwine/1, + region/1, + riesling/1, + rosewine/1, + sancerre/1, + sauternes/1, + sauvignonblanc/1, + semillon/1, + semillonorsauvignonblanc/1, + stemilion/1, + sweetriesling/1, + sweetwine/1, + tablewine/1, + texaswine/1, + tours/1, + vintage/1, + vintageyear/1, + whitebordeaux/1, + whiteburgundy/1, + whiteloire/1, + whitenonsweetwine/1, + whitetablewine/1, + whitewine/1, + wine/1, + winebody/1, + winecolor/1, + winedescriptor/1, + wineflavor/1, + winegrape/1, + winesugar/1, + winery/1, + winetaste/1, + zinfandel/1, + adjacentregion/2, + hasbody/2, + hascolor/2, + hasflavor/2, + hasmaker/2, + hassugar/2, + hasvintageyear/2, + haswinedescriptor/2, + locatedin/2, + madefromgrape/2, + madefromfruit/2, + madeintowine/2, + produceswine/2, + kaon2hu/1, + kaon2equal/2, + q0/1, + q1/1, + q10/1, + q11/1, + q12/1, + q13/1, + q14/1, + q15/1, + q16/1, + q17/1, + q18/1, + q19/1, + q2/1, + q20/1, + q21/1, + q22/1, + q23/1, + q24/1, + q26/1, + q27/1, + q29/1, + q3/1, + q30/1, + q31/1, + q32/1, + q33/1, + q34/1, + q35/1, + q36/1, + q37/1, + q38/1, + q39/1, + q4/1, + q40/1, + q41/1, + q42/1, + q43/1, + q44/1, + q45/1, + q46/1, + q47/1, + q48/1, + q49/1, + q5/1, + q50/1, + q51/1, + q52/1, + q55/1, + q56/1, + q57/1, + q58/1, + q59/1, + q6/1, + q60/1, + q61/1, + q62/1, + q63/1, + q64/1, + q65/1, + q66/1, + q67/1, + q68/1, + q69/1, + q7/1, + q70/1, + q71/1, + q72/1, + q73/1, + q74/1, + q9/1, + ot____nom1/1, + ot____nom10/1, + ot____nom11/1, + ot____nom12/1, + ot____nom13/1, + ot____nom14/1, + ot____nom15/1, + ot____nom16/1, + ot____nom17/1, + ot____nom18/1, + ot____nom19/1, + ot____nom2/1, + ot____nom20/1, + ot____nom21/1, + ot____nom22/1, + ot____nom23/1, + ot____nom24/1, + ot____nom25/1, + ot____nom26/1, + ot____nom27/1, + ot____nom28/1, + ot____nom29/1, + ot____nom3/1, + ot____nom30/1, + ot____nom31/1, + ot____nom32/1, + ot____nom33/1, + ot____nom34/1, + ot____nom35/1, + ot____nom36/1, + ot____nom37/1, + ot____nom38/1, + ot____nom39/1, + ot____nom4/1, + ot____nom40/1, + ot____nom41/1, + ot____nom42/1, + ot____nom43/1, + ot____nom44/1, + ot____nom45/1, + ot____nom46/1, + ot____nom47/1, + ot____nom48/1, + ot____nom49/1, + ot____nom5/1, + ot____nom50/1, + ot____nom51/1, + ot____nom52/1, + ot____nom53/1, + ot____nom54/1, + ot____nom55/1, + ot____nom56/1, + ot____nom57/1, + ot____nom58/1, + ot____nom59/1, + ot____nom6/1, + ot____nom60/1, + ot____nom61/1, + ot____nom62/1, + ot____nom63/1, + ot____nom64/1, + ot____nom7/1, + ot____nom8/1, + ot____nom9/1. + +/* ---------------------------------------------------------------------------- + * Benchmark Program: + *----------------------------------------------------------------------------- + */ + +madefromgrape(A,B) :- + madefromgrape_aux(A,B). +locatedin(A,B) :- + locatedin_aux(A,B). +hassugar(A,B) :- + hassugar_aux(A,B). +hasmaker(A,B) :- + hasmaker_aux(A,B). +hasflavor(A,B) :- + hasflavor_aux(A,B). +hascolor(A,B) :- + hascolor_aux(A,B). +hasbody(A,B) :- + hasbody_aux(A,B). +adjacentregion(A,B) :- + adjacentregion_aux(A,B). +hasvintageyear(A,B) :- + hasvintageyear_aux(A,B). +ot____nom1(A) :- + ot____nom1_aux(A). +ot____nom10(A) :- + ot____nom10_aux(A). +ot____nom11(A) :- + ot____nom11_aux(A). +ot____nom12(A) :- + ot____nom12_aux(A). +ot____nom13(A) :- + ot____nom13_aux(A). +ot____nom14(A) :- + ot____nom14_aux(A). +ot____nom15(A) :- + ot____nom15_aux(A). +ot____nom16(A) :- + ot____nom16_aux(A). +ot____nom17(A) :- + ot____nom17_aux(A). +ot____nom18(A) :- + ot____nom18_aux(A). +ot____nom19(A) :- + ot____nom19_aux(A). +ot____nom2(A) :- + ot____nom2_aux(A). +ot____nom20(A) :- + ot____nom20_aux(A). +ot____nom21(A) :- + ot____nom21_aux(A). +ot____nom22(A) :- + ot____nom22_aux(A). +ot____nom23(A) :- + ot____nom23_aux(A). +ot____nom24(A) :- + ot____nom24_aux(A). +ot____nom25(A) :- + ot____nom25_aux(A). +ot____nom26(A) :- + ot____nom26_aux(A). +ot____nom27(A) :- + ot____nom27_aux(A). +ot____nom28(A) :- + ot____nom28_aux(A). +ot____nom29(A) :- + ot____nom29_aux(A). +ot____nom3(A) :- + ot____nom3_aux(A). +ot____nom30(A) :- + ot____nom30_aux(A). +ot____nom31(A) :- + ot____nom31_aux(A). +ot____nom32(A) :- + ot____nom32_aux(A). +ot____nom33(A) :- + ot____nom33_aux(A). +ot____nom34(A) :- + ot____nom34_aux(A). +ot____nom35(A) :- + ot____nom35_aux(A). +ot____nom36(A) :- + ot____nom36_aux(A). +ot____nom37(A) :- + ot____nom37_aux(A). +ot____nom38(A) :- + ot____nom38_aux(A). +ot____nom39(A) :- + ot____nom39_aux(A). +ot____nom4(A) :- + ot____nom4_aux(A). +ot____nom40(A) :- + ot____nom40_aux(A). +ot____nom41(A) :- + ot____nom41_aux(A). +ot____nom42(A) :- + ot____nom42_aux(A). +ot____nom43(A) :- + ot____nom43_aux(A). +ot____nom44(A) :- + ot____nom44_aux(A). +ot____nom45(A) :- + ot____nom45_aux(A). +ot____nom46(A) :- + ot____nom46_aux(A). +ot____nom47(A) :- + ot____nom47_aux(A). +ot____nom48(A) :- + ot____nom48_aux(A). +ot____nom49(A) :- + ot____nom49_aux(A). +ot____nom5(A) :- + ot____nom5_aux(A). +ot____nom50(A) :- + ot____nom50_aux(A). +ot____nom51(A) :- + ot____nom51_aux(A). +ot____nom52(A) :- + ot____nom52_aux(A). +ot____nom53(A) :- + ot____nom53_aux(A). +ot____nom54(A) :- + ot____nom54_aux(A). +ot____nom55(A) :- + ot____nom55_aux(A). +ot____nom56(A) :- + ot____nom56_aux(A). +ot____nom57(A) :- + ot____nom57_aux(A). +ot____nom58(A) :- + ot____nom58_aux(A). +ot____nom59(A) :- + ot____nom59_aux(A). +ot____nom6(A) :- + ot____nom6_aux(A). +ot____nom60(A) :- + ot____nom60_aux(A). +ot____nom61(A) :- + ot____nom61_aux(A). +ot____nom62(A) :- + ot____nom62_aux(A). +ot____nom63(A) :- + ot____nom63_aux(A). +ot____nom64(A) :- + ot____nom64_aux(A). +ot____nom7(A) :- + ot____nom7_aux(A). +ot____nom8(A) :- + ot____nom8_aux(A). +ot____nom9(A) :- + ot____nom9_aux(A). +zinfandel(A) :- + zinfandel_aux(A). +winery(A) :- + winery_aux(A). +winegrape(A) :- + winegrape_aux(A). +winesugar(A) :- + winesugar_aux(A). +wineflavor(A) :- + wineflavor_aux(A). +anjou(A) :- + anjou_aux(A). +beaujolais(A) :- + beaujolais_aux(A). +cabernetfranc(A) :- + cabernetfranc_aux(A). +cabernetsauvignon(A) :- + cabernetsauvignon_aux(A). +chardonnay(A) :- + chardonnay_aux(A). +cheninblanc(A) :- + cheninblanc_aux(A). +chianti(A) :- + chianti_aux(A). +cotesdor(A) :- + cotesdor_aux(A). +dessertwine(A) :- + dessertwine_aux(A). +dryriesling(A) :- + dryriesling_aux(A). +icewine(A) :- + icewine_aux(A). +margaux(A) :- + margaux_aux(A). +meritage(A) :- + meritage_aux(A). +merlot(A) :- + merlot_aux(A). +meursault(A) :- + meursault_aux(A). +muscadet(A) :- + muscadet_aux(A). +pauillac(A) :- + pauillac_aux(A). +petitesyrah(A) :- + petitesyrah_aux(A). +pinotnoir(A) :- + pinotnoir_aux(A). +port(A) :- + port_aux(A). +redtablewine(A) :- + redtablewine_aux(A). +region(A) :- + region_aux(A). +riesling(A) :- + riesling_aux(A). +sancerre(A) :- + sancerre_aux(A). +sauternes(A) :- + sauternes_aux(A). +sauvignonblanc(A) :- + sauvignonblanc_aux(A). +semillon(A) :- + semillon_aux(A). +stemilion(A) :- + stemilion_aux(A). +sweetriesling(A) :- + sweetriesling_aux(A). +vintageyear(A) :- + vintageyear_aux(A). +whiteburgundy(A) :- + whiteburgundy_aux(A). +whitewine(A) :- + whitewine_aux(A). +winebody(A) :- + winebody_aux(A). +winecolor(A) :- + winecolor_aux(A). +q0(A) :- + meritage(A). +q0(A) :- + merlot(A). +q0(A) :- + pinotnoir(A). +q0(A) :- + beaujolais(A). +q0(A) :- + cabernetfranc(A). +q0(A) :- + zinfandel(A). +q0(A) :- + medoc(A). +q0(A) :- + cabernetsauvignon(A). +q0(A) :- + redtablewine(A). +q0(A) :- + petitesyrah(A). +q0(A) :- + redwine(A). +q0(A) :- + chianti(A). +q0(A) :- + stemilion(A). +q0(A) :- + ( var(A) -> + q0(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q0(B) + ). +q1(A) :- + bordeaux(A). +q1(A) :- + ( var(A) -> + locatedin(A,B), + q2(B) + ; + locatedin(A,B), + q2(B) + ). +q1(A) :- + ( var(A) -> + q1(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q1(B) + ). +q10(A) :- + q9(A). +q10(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom4(B) + ; + locatedin(A,B), + ot____nom4(B) + ). +q10(A) :- + ( var(A) -> + q10(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q10(B) + ). +q11(A) :- + pauillac(A). +q11(A) :- + port(A). +q11(A) :- + stemilion(A). +q11(A) :- + ( var(A) -> + q11(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q11(B) + ). +q12(A) :- + icewine(A). +q12(A) :- + whitetablewine(A). +q12(A) :- + cheninblanc(A). +q12(A) :- + chardonnay(A). +q12(A) :- + pinotblanc(A). +q12(A) :- + whitewine(A). +q12(A) :- + dryriesling(A). +q12(A) :- + sauternes(A). +q12(A) :- + semillonorsauvignonblanc(A). +q12(A) :- + riesling(A). +q12(A) :- + ( var(A) -> + q12(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q12(B) + ). +q13(A) :- + margaux(A). +q13(A) :- + merlot(A). +q13(A) :- + ( var(A) -> + q13(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q13(B) + ). +q14(A) :- + gamay(A). +q14(A) :- + beaujolais(A). +q14(A) :- + ( var(A) -> + q14(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q14(B) + ). +q15(A) :- + anjou(A). +q15(A) :- + rosewine(A). +q15(A) :- + ( var(A) -> + q15(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q15(B) + ). +q16(A) :- + meursault(A). +q16(A) :- + ( var(A) -> + locatedin(A,B), + q17(B) + ; + locatedin(A,B), + q17(B) + ). +q16(A) :- + ( var(A) -> + q16(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q16(B) + ). +q17(A) :- + q16(A). +q17(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom31(B) + ; + locatedin(A,B), + ot____nom31(B) + ). +q17(A) :- + ( var(A) -> + q17(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q17(B) + ). +q18(A) :- + margaux(A). +q18(A) :- + ( var(A) -> + locatedin(A,B), + q19(B) + ; + locatedin(A,B), + q19(B) + ). +q18(A) :- + ( var(A) -> + q18(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q18(B) + ). +q19(A) :- + q18(A). +q19(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom22(B) + ; + locatedin(A,B), + ot____nom22(B) + ). +q19(A) :- + ( var(A) -> + q19(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q19(B) + ). +q2(A) :- + q1(A). +q2(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom23(B) + ; + locatedin(A,B), + ot____nom23(B) + ). +q2(A) :- + ( var(A) -> + q2(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q2(B) + ). +q20(A) :- + sancerre(A). +q20(A) :- + muscadet(A). +q20(A) :- + beaujolais(A). +q20(A) :- + dryriesling(A). +q20(A) :- + anjou(A). +q20(A) :- + margaux(A). +q20(A) :- + ( var(A) -> + q20(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q20(B) + ). +q21(A) :- + q12(A). +q21(A) :- + ( var(A) -> + hascolor(A,B), + ot____nom5(B) + ; + hascolor(A,B), + ot____nom5(B) + ). +q21(A) :- + ( var(A) -> + q21(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q21(B) + ). +q22(A) :- + beaujolais(A). +q22(A) :- + ( var(A) -> + locatedin(A,B), + q23(B) + ; + locatedin(A,B), + q23(B) + ). +q22(A) :- + ( var(A) -> + q22(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q22(B) + ). +q23(A) :- + q22(A). +q23(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom26(B) + ; + locatedin(A,B), + ot____nom26(B) + ). +q23(A) :- + ( var(A) -> + q23(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q23(B) + ). +q24(A) :- + pinotblanc(A). +q24(A) :- + muscadet(A). +q24(A) :- + ( var(A) -> + q24(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q24(B) + ). +q26(A) :- + americanwine(A). +q26(A) :- + ( var(A) -> + locatedin(A,B), + q27(B) + ; + locatedin(A,B), + q27(B) + ). +q26(A) :- + ( var(A) -> + q26(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q26(B) + ). +q27(A) :- + q26(A). +q27(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom38(B) + ; + locatedin(A,B), + ot____nom38(B) + ). +q27(A) :- + ( var(A) -> + q27(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q27(B) + ). +q29(A) :- + burgundy(A). +q29(A) :- + ( var(A) -> + locatedin(A,B), + q30(B) + ; + locatedin(A,B), + q30(B) + ). +q29(A) :- + ( var(A) -> + q29(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q29(B) + ). +q3(A) :- + margaux(A). +q3(A) :- + pauillac(A). +q3(A) :- + zinfandel(A). +q3(A) :- + chardonnay(A). +q3(A) :- + tours(A). +q3(A) :- + riesling(A). +q3(A) :- + semillon(A). +q3(A) :- + petitesyrah(A). +q3(A) :- + whiteburgundy(A). +q3(A) :- + cabernetsauvignon(A). +q3(A) :- + cheninblanc(A). +q3(A) :- + sauvignonblanc(A). +q3(A) :- + cabernetfranc(A). +q3(A) :- + beaujolais(A). +q3(A) :- + stemilion(A). +q3(A) :- + pinotnoir(A). +q3(A) :- + sancerre(A). +q3(A) :- + redburgundy(A). +q3(A) :- + muscadet(A). +q3(A) :- + merlot(A). +q3(A) :- + pinotblanc(A). +q3(A) :- + gamay(A). +q3(A) :- + ( var(A) -> + q3(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q3(B) + ). +q3(A) :- + ( var(A) -> + ot____nom8(A), + wine(A), + kaon2namedobjects(A) + ; + ot____nom8(A), + wine(A), + kaon2namedobjects(A) + ). +q30(A) :- + q29(A). +q30(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom44(B) + ; + locatedin(A,B), + ot____nom44(B) + ). +q30(A) :- + ( var(A) -> + q30(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q30(B) + ). +q31(A) :- + chianti(A). +q31(A) :- + cabernetsauvignon(A). +q31(A) :- + medoc(A). +q31(A) :- + merlot(A). +q31(A) :- + muscadet(A). +q31(A) :- + tablewine(A). +q31(A) :- + drywine(A). +q31(A) :- + beaujolais(A). +q31(A) :- + zinfandel(A). +q31(A) :- + cabernetfranc(A). +q31(A) :- + burgundy(A). +q31(A) :- + dryriesling(A). +q31(A) :- + petitesyrah(A). +q31(A) :- + ( var(A) -> + q31(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q31(B) + ). +q32(A) :- + sancerre(A). +q32(A) :- + anjou(A). +q32(A) :- + ( var(A) -> + q32(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q32(B) + ). +q33(A) :- + medoc(A). +q33(A) :- + ( var(A) -> + locatedin(A,B), + q34(B) + ; + locatedin(A,B), + q34(B) + ). +q33(A) :- + ( var(A) -> + q33(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q33(B) + ). +q34(A) :- + q33(A). +q34(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom2(B) + ; + locatedin(A,B), + ot____nom2(B) + ). +q34(A) :- + ( var(A) -> + q34(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q34(B) + ). +q35(A) :- + pauillac(A). +q35(A) :- + port(A). +q35(A) :- + sweetriesling(A). +q35(A) :- + meursault(A). +q35(A) :- + fullbodiedwine(A). +q35(A) :- + ( var(A) -> + q35(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q35(B) + ). +q36(A) :- + whitenonsweetwine(A). +q36(A) :- + earlyharvest(A). +q36(A) :- + cheninblanc(A). +q36(A) :- + ( var(A) -> + q36(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q36(B) + ). +q37(A) :- + cotesdor(A). +q37(A) :- + ( var(A) -> + locatedin(A,B), + q38(B) + ; + locatedin(A,B), + q38(B) + ). +q37(A) :- + ( var(A) -> + q37(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q37(B) + ). +q38(A) :- + q37(A). +q38(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom42(B) + ; + locatedin(A,B), + ot____nom42(B) + ). +q38(A) :- + ( var(A) -> + q38(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q38(B) + ). +q39(A) :- + sancerre(A). +q39(A) :- + ( var(A) -> + locatedin(A,B), + q40(B) + ; + locatedin(A,B), + q40(B) + ). +q39(A) :- + ( var(A) -> + q39(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q39(B) + ). +q4(A) :- + cheninblanc(A). +q4(A) :- + chianti(A). +q4(A) :- + cabernetfranc(A). +q4(A) :- + cotesdor(A). +q4(A) :- + ( var(A) -> + q4(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q4(B) + ). +q40(A) :- + q39(A). +q40(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom30(B) + ; + locatedin(A,B), + ot____nom30(B) + ). +q40(A) :- + ( var(A) -> + q40(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q40(B) + ). +q41(A) :- + q0(A). +q41(A) :- + ( var(A) -> + hascolor(A,B), + ot____nom28(B) + ; + hascolor(A,B), + ot____nom28(B) + ). +q41(A) :- + ( var(A) -> + q41(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q41(B) + ). +q42(A) :- + pauillac(A). +q42(A) :- + ( var(A) -> + locatedin(A,B), + q43(B) + ; + locatedin(A,B), + q43(B) + ). +q42(A) :- + ( var(A) -> + q42(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q42(B) + ). +q43(A) :- + q42(A). +q43(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom46(B) + ; + locatedin(A,B), + ot____nom46(B) + ). +q43(A) :- + ( var(A) -> + q43(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q43(B) + ). +q44(A) :- + sancerre(A). +q44(A) :- + sauvignonblanc(A). +q44(A) :- + ( var(A) -> + q44(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q44(B) + ). +q45(A) :- + beaujolais(A). +q45(A) :- + muscadet(A). +q45(A) :- + anjou(A). +q45(A) :- + ( var(A) -> + q45(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q45(B) + ). +q46(A) :- + q31(A). +q46(A) :- + ( var(A) -> + hassugar(A,B), + ot____nom12(B) + ; + hassugar(A,B), + ot____nom12(B) + ). +q46(A) :- + ( var(A) -> + q46(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q46(B) + ). +q47(A) :- + californiawine(A). +q47(A) :- + ( var(A) -> + locatedin(A,B), + q48(B) + ; + locatedin(A,B), + q48(B) + ). +q47(A) :- + ( var(A) -> + q47(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q47(B) + ). +q48(A) :- + q47(A). +q48(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom15(B) + ; + locatedin(A,B), + ot____nom15(B) + ). +q48(A) :- + ( var(A) -> + q48(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q48(B) + ). +q49(A) :- + germanwine(A). +q49(A) :- + ( var(A) -> + locatedin(A,B), + q50(B) + ; + locatedin(A,B), + q50(B) + ). +q49(A) :- + ( var(A) -> + q49(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q49(B) + ). +q5(A) :- + meritage(A). +q5(A) :- + q24(A). +q5(A) :- + q6(A). +q5(A) :- + q13(A). +q5(A) :- + q72(A). +q5(A) :- + q14(A). +q5(A) :- + q69(A). +q5(A) :- + q63(A). +q5(A) :- + ( var(A) -> + q44(A), + semillonorsauvignonblanc(A) + ; + q44(A), + semillonorsauvignonblanc(A) + ). +q5(A) :- + ( var(A) -> + q5(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q5(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom3(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom3(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom43(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom43(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom24(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom24(B) + ). +q5(A) :- + ( var(A) -> + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom11(B) + ; + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom11(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom34(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom34(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom37(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom37(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom20(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom20(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom33(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom33(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom39(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom39(B) + ). +q5(A) :- + ( var(A) -> + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom27(B) + ; + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom27(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom25(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom25(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom21(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom21(B) + ). +q5(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom29(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom29(B) + ). +q50(A) :- + q49(A). +q50(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom17(B) + ; + locatedin(A,B), + ot____nom17(B) + ). +q50(A) :- + ( var(A) -> + q50(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q50(B) + ). +q51(A) :- + frenchwine(A). +q51(A) :- + ( var(A) -> + locatedin(A,B), + q52(B) + ; + locatedin(A,B), + q52(B) + ). +q51(A) :- + ( var(A) -> + q51(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q51(B) + ). +q52(A) :- + q51(A). +q52(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom41(B) + ; + locatedin(A,B), + ot____nom41(B) + ). +q52(A) :- + ( var(A) -> + q52(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q52(B) + ). +q55(A) :- + muscadet(A). +q55(A) :- + ( var(A) -> + locatedin(A,B), + q56(B) + ; + locatedin(A,B), + q56(B) + ). +q55(A) :- + ( var(A) -> + q55(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q55(B) + ). +q56(A) :- + q55(A). +q56(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom16(B) + ; + locatedin(A,B), + ot____nom16(B) + ). +q56(A) :- + ( var(A) -> + q56(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q56(B) + ). +q57(A) :- + loire(A). +q57(A) :- + ( var(A) -> + locatedin(A,B), + q58(B) + ; + locatedin(A,B), + q58(B) + ). +q57(A) :- + ( var(A) -> + q57(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q57(B) + ). +q58(A) :- + q57(A). +q58(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom19(B) + ; + locatedin(A,B), + ot____nom19(B) + ). +q58(A) :- + ( var(A) -> + q58(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q58(B) + ). +q59(A) :- + alsatianwine(A). +q59(A) :- + ( var(A) -> + locatedin(A,B), + q60(B) + ; + locatedin(A,B), + q60(B) + ). +q59(A) :- + ( var(A) -> + q59(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q59(B) + ). +q6(A) :- + cheninblanc(A). +q6(A) :- + tours(A). +q6(A) :- + ( var(A) -> + q6(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q6(B) + ). +q60(A) :- + q59(A). +q60(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom13(B) + ; + locatedin(A,B), + ot____nom13(B) + ). +q60(A) :- + ( var(A) -> + q60(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q60(B) + ). +q61(A) :- + italianwine(A). +q61(A) :- + ( var(A) -> + locatedin(A,B), + q62(B) + ; + locatedin(A,B), + q62(B) + ). +q61(A) :- + ( var(A) -> + q61(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q61(B) + ). +q62(A) :- + q61(A). +q62(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom47(B) + ; + locatedin(A,B), + ot____nom47(B) + ). +q62(A) :- + ( var(A) -> + q62(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q62(B) + ). +q63(A) :- + chardonnay(A). +q63(A) :- + whiteburgundy(A). +q63(A) :- + ( var(A) -> + q63(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q63(B) + ). +q64(A) :- + stemilion(A). +q64(A) :- + ( var(A) -> + locatedin(A,B), + q65(B) + ; + locatedin(A,B), + q65(B) + ). +q64(A) :- + ( var(A) -> + q64(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q64(B) + ). +q65(A) :- + q64(A). +q65(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom36(B) + ; + locatedin(A,B), + ot____nom36(B) + ). +q65(A) :- + ( var(A) -> + q65(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q65(B) + ). +q66(A) :- + anjou(A). +q66(A) :- + ( var(A) -> + locatedin(A,B), + q67(B) + ; + locatedin(A,B), + q67(B) + ). +q66(A) :- + ( var(A) -> + q66(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q66(B) + ). +q67(A) :- + q66(A). +q67(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom14(B) + ; + locatedin(A,B), + ot____nom14(B) + ). +q67(A) :- + ( var(A) -> + q67(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q67(B) + ). +q68(A) :- + whitebordeaux(A). +q68(A) :- + semillonorsauvignonblanc(A). +q68(A) :- + ( var(A) -> + q68(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q68(B) + ). +q69(A) :- + pauillac(A). +q69(A) :- + cabernetsauvignon(A). +q69(A) :- + stemilion(A). +q69(A) :- + ( var(A) -> + q69(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q69(B) + ). +q7(A) :- + cabernetfranc(A). +q7(A) :- + sauternes(A). +q7(A) :- + sancerre(A). +q7(A) :- + ( var(A) -> + q7(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q7(B) + ). +q70(A) :- + sweetriesling(A). +q70(A) :- + port(A). +q70(A) :- + sweetwine(A). +q70(A) :- + lateharvest(A). +q70(A) :- + ( var(A) -> + q70(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q70(B) + ). +q71(A) :- + q70(A). +q71(A) :- + ( var(A) -> + hassugar(A,B), + ot____nom1(B) + ; + hassugar(A,B), + ot____nom1(B) + ). +q71(A) :- + ( var(A) -> + q71(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q71(B) + ). +q72(A) :- + pinotnoir(A). +q72(A) :- + redburgundy(A). +q72(A) :- + ( var(A) -> + q72(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q72(B) + ). +q73(A) :- + texaswine(A). +q73(A) :- + ( var(A) -> + locatedin(A,B), + q74(B) + ; + locatedin(A,B), + q74(B) + ). +q73(A) :- + ( var(A) -> + q73(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q73(B) + ). +q74(A) :- + q73(A). +q74(A) :- + ( var(A) -> + locatedin(A,B), + ot____nom10(B) + ; + locatedin(A,B), + ot____nom10(B) + ). +q74(A) :- + ( var(A) -> + q74(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q74(B) + ). +q9(A) :- + tours(A). +q9(A) :- + ( var(A) -> + locatedin(A,B), + q10(B) + ; + locatedin(A,B), + q10(B) + ). +q9(A) :- + ( var(A) -> + q9(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + q9(B) + ). +alsatianwine(A) :- + ( var(A) -> + q60(A), + wine(A) + ; + q60(A), + wine(A) + ). +alsatianwine(A) :- + ( var(A) -> + alsatianwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + alsatianwine(B) + ). +americanwine(A) :- + ( var(A) -> + q27(A), + wine(A) + ; + q27(A), + wine(A) + ). +americanwine(A) :- + ( var(A) -> + americanwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + americanwine(B) + ). +anjou(A) :- + ( var(A) -> + q67(A), + loire(A) + ; + q67(A), + loire(A) + ). +anjou(A) :- + ( var(A) -> + anjou(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + anjou(B) + ). +beaujolais(A) :- + ( var(A) -> + q23(A), + wine(A) + ; + q23(A), + wine(A) + ). +beaujolais(A) :- + ( var(A) -> + beaujolais(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + beaujolais(B) + ). +bordeaux(A) :- + sauternes(A). +bordeaux(A) :- + medoc(A). +bordeaux(A) :- + redbordeaux(A). +bordeaux(A) :- + stemilion(A). +bordeaux(A) :- + whitebordeaux(A). +bordeaux(A) :- + ( var(A) -> + q2(A), + wine(A) + ; + q2(A), + wine(A) + ). +bordeaux(A) :- + ( var(A) -> + bordeaux(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + bordeaux(B) + ). +burgundy(A) :- + whiteburgundy(A). +burgundy(A) :- + redburgundy(A). +burgundy(A) :- + ( var(A) -> + q30(A), + wine(A) + ; + q30(A), + wine(A) + ). +burgundy(A) :- + ( var(A) -> + burgundy(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + burgundy(B) + ). +cabernetfranc(A) :- + ( var(A) -> + cabernetfranc(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + cabernetfranc(B) + ). +cabernetfranc(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom3(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom3(B) + ). +cabernetsauvignon(A) :- + q69(A). +cabernetsauvignon(A) :- + ( var(A) -> + cabernetsauvignon(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + cabernetsauvignon(B) + ). +cabernetsauvignon(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom29(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom29(B) + ). +californiawine(A) :- + ( var(A) -> + q48(A), + wine(A) + ; + q48(A), + wine(A) + ). +californiawine(A) :- + ( var(A) -> + californiawine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + californiawine(B) + ). +chardonnay(A) :- + q63(A). +chardonnay(A) :- + ( var(A) -> + chardonnay(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + chardonnay(B) + ). +chardonnay(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom24(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom24(B) + ). +cheninblanc(A) :- + q6(A). +cheninblanc(A) :- + ( var(A) -> + cheninblanc(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + cheninblanc(B) + ). +cheninblanc(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom34(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom34(B) + ). +chianti(A) :- + ( var(A) -> + chianti(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + chianti(B) + ). +cotesdor(A) :- + ( var(A) -> + q38(A), + redburgundy(A) + ; + q38(A), + redburgundy(A) + ). +cotesdor(A) :- + ( var(A) -> + cotesdor(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + cotesdor(B) + ). +dessertwine(A) :- + sweetriesling(A). +dessertwine(A) :- + icewine(A). +dessertwine(A) :- + ( var(A) -> + dessertwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + dessertwine(B) + ). +dryredwine(A) :- + ( var(A) -> + drywine(A), + redwine(A) + ; + drywine(A), + redwine(A) + ). +dryredwine(A) :- + ( var(A) -> + dryredwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + dryredwine(B) + ). +dryriesling(A) :- + ( var(A) -> + q46(A), + riesling(A) + ; + q46(A), + riesling(A) + ). +dryriesling(A) :- + ( var(A) -> + dryriesling(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + dryriesling(B) + ). +drywhitewine(A) :- + ( var(A) -> + drywine(A), + whitewine(A) + ; + drywine(A), + whitewine(A) + ). +drywhitewine(A) :- + ( var(A) -> + drywhitewine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + drywhitewine(B) + ). +drywine(A) :- + drywhitewine(A). +drywine(A) :- + dryredwine(A). +drywine(A) :- + ( var(A) -> + q46(A), + wine(A) + ; + q46(A), + wine(A) + ). +drywine(A) :- + ( var(A) -> + drywine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + drywine(B) + ). +earlyharvest(A) :- + ( var(A) -> + earlyharvest(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + earlyharvest(B) + ). +frenchwine(A) :- + ( var(A) -> + q52(A), + wine(A) + ; + q52(A), + wine(A) + ). +frenchwine(A) :- + ( var(A) -> + frenchwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + frenchwine(B) + ). +fullbodiedwine(A) :- + q35(A). +fullbodiedwine(A) :- + ( var(A) -> + fullbodiedwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + fullbodiedwine(B) + ). +fullbodiedwine(A) :- + ( var(A) -> + wine(A), + hasbody(A,B), + ot____nom45(B) + ; + wine(A), + hasbody(A,B), + ot____nom45(B) + ). +gamay(A) :- + q14(A). +gamay(A) :- + ( var(A) -> + gamay(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + gamay(B) + ). +gamay(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom33(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom33(B) + ). +germanwine(A) :- + ( var(A) -> + q50(A), + wine(A) + ; + q50(A), + wine(A) + ). +germanwine(A) :- + ( var(A) -> + germanwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + germanwine(B) + ). +grape(A) :- + winegrape(A). +grape(A) :- + ( var(A) -> + grape(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + grape(B) + ). +icewine(A) :- + ( var(A) -> + icewine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + icewine(B) + ). +icewine(A) :- + ( var(A) -> + q21(A), + dessertwine(A), + lateharvest(A) + ; + q21(A), + dessertwine(A), + lateharvest(A) + ). +italianwine(A) :- + chianti(A). +italianwine(A) :- + ( var(A) -> + q62(A), + wine(A) + ; + q62(A), + wine(A) + ). +italianwine(A) :- + ( var(A) -> + italianwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + italianwine(B) + ). +lateharvest(A) :- + icewine(A). +lateharvest(A) :- + sauternes(A). +lateharvest(A) :- + ( var(A) -> + lateharvest(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + lateharvest(B) + ). +loire(A) :- + sancerre(A). +loire(A) :- + tours(A). +loire(A) :- + whiteloire(A). +loire(A) :- + anjou(A). +loire(A) :- + muscadet(A). +loire(A) :- + ( var(A) -> + q58(A), + wine(A) + ; + q58(A), + wine(A) + ). +loire(A) :- + ( var(A) -> + loire(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + loire(B) + ). +margaux(A) :- + ( var(A) -> + q19(A), + medoc(A) + ; + q19(A), + medoc(A) + ). +margaux(A) :- + ( var(A) -> + margaux(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + margaux(B) + ). +medoc(A) :- + pauillac(A). +medoc(A) :- + margaux(A). +medoc(A) :- + ( var(A) -> + q34(A), + bordeaux(A) + ; + q34(A), + bordeaux(A) + ). +medoc(A) :- + ( var(A) -> + medoc(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + medoc(B) + ). +meritage(A) :- + ( var(A) -> + meritage(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + meritage(B) + ). +meritage(A) :- + ( var(A) -> + ot____nom8(A), + wine(A), + kaon2namedobjects(A) + ; + ot____nom8(A), + wine(A), + kaon2namedobjects(A) + ). +merlot(A) :- + q13(A). +merlot(A) :- + ( var(A) -> + merlot(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + merlot(B) + ). +merlot(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom43(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom43(B) + ). +meursault(A) :- + ( var(A) -> + q17(A), + whiteburgundy(A) + ; + q17(A), + whiteburgundy(A) + ). +meursault(A) :- + ( var(A) -> + meursault(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + meursault(B) + ). +muscadet(A) :- + ( var(A) -> + q56(A), + loire(A) + ; + q56(A), + loire(A) + ). +muscadet(A) :- + ( var(A) -> + muscadet(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + muscadet(B) + ). +pauillac(A) :- + ( var(A) -> + q43(A), + medoc(A) + ; + q43(A), + medoc(A) + ). +pauillac(A) :- + ( var(A) -> + pauillac(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + pauillac(B) + ). +petitesyrah(A) :- + ( var(A) -> + petitesyrah(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + petitesyrah(B) + ). +petitesyrah(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom25(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom25(B) + ). +pinotblanc(A) :- + q24(A). +pinotblanc(A) :- + ( var(A) -> + pinotblanc(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + pinotblanc(B) + ). +pinotblanc(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom21(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom21(B) + ). +pinotnoir(A) :- + q72(A). +pinotnoir(A) :- + ( var(A) -> + pinotnoir(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + pinotnoir(B) + ). +pinotnoir(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom39(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom39(B) + ). +port(A) :- + ( var(A) -> + port(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + port(B) + ). +potableliquid(A) :- + wine(A). +potableliquid(A) :- + ( var(A) -> + potableliquid(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + potableliquid(B) + ). +redbordeaux(A) :- + ( var(A) -> + redwine(A), + bordeaux(A) + ; + redwine(A), + bordeaux(A) + ). +redbordeaux(A) :- + ( var(A) -> + redbordeaux(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + redbordeaux(B) + ). +redburgundy(A) :- + cotesdor(A). +redburgundy(A) :- + ( var(A) -> + burgundy(A), + redwine(A) + ; + burgundy(A), + redwine(A) + ). +redburgundy(A) :- + ( var(A) -> + redburgundy(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + redburgundy(B) + ). +redtablewine(A) :- + ( var(A) -> + q41(A), + tablewine(A) + ; + q41(A), + tablewine(A) + ). +redtablewine(A) :- + ( var(A) -> + redtablewine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + redtablewine(B) + ). +redwine(A) :- + redburgundy(A). +redwine(A) :- + redbordeaux(A). +redwine(A) :- + dryredwine(A). +redwine(A) :- + port(A). +redwine(A) :- + ( var(A) -> + q41(A), + wine(A) + ; + q41(A), + wine(A) + ). +redwine(A) :- + ( var(A) -> + redwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + redwine(B) + ). +region(A) :- + adjacentregion(_,A). +region(A) :- + locatedin(_,A). +region(A) :- + adjacentregion(A,_). +region(A) :- + ( var(A) -> + wine(A), + kaon2namedobjects(A) + ; + wine(A), + kaon2namedobjects(A) + ). +region(A) :- + ( var(A) -> + region(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + region(B) + ). +riesling(A) :- + dryriesling(A). +riesling(A) :- + sweetriesling(A). +riesling(A) :- + ( var(A) -> + riesling(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + riesling(B) + ). +riesling(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom37(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom37(B) + ). +rosewine(A) :- + q15(A). +rosewine(A) :- + ( var(A) -> + rosewine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + rosewine(B) + ). +rosewine(A) :- + ( var(A) -> + wine(A), + hascolor(A,B), + ot____nom32(B) + ; + wine(A), + hascolor(A,B), + ot____nom32(B) + ). +sancerre(A) :- + ( var(A) -> + q40(A), + loire(A) + ; + q40(A), + loire(A) + ). +sancerre(A) :- + ( var(A) -> + sancerre(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + sancerre(B) + ). +sauternes(A) :- + ( var(A) -> + sauternes(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + sauternes(B) + ). +sauvignonblanc(A) :- + ( var(A) -> + q44(A), + semillonorsauvignonblanc(A) + ; + q44(A), + semillonorsauvignonblanc(A) + ). +sauvignonblanc(A) :- + ( var(A) -> + sauvignonblanc(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + sauvignonblanc(B) + ). +sauvignonblanc(A) :- + ( var(A) -> + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom11(B) + ; + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom11(B) + ). +semillon(A) :- + ( var(A) -> + semillon(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + semillon(B) + ). +semillon(A) :- + ( var(A) -> + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom27(B) + ; + semillonorsauvignonblanc(A), + madefromgrape(A,B), + ot____nom27(B) + ). +semillonorsauvignonblanc(A) :- + semillon(A). +semillonorsauvignonblanc(A) :- + sauvignonblanc(A). +semillonorsauvignonblanc(A) :- + ( var(A) -> + q68(A), + wine(A) + ; + q68(A), + wine(A) + ). +semillonorsauvignonblanc(A) :- + ( var(A) -> + semillonorsauvignonblanc(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + semillonorsauvignonblanc(B) + ). +semillonorsauvignonblanc(A) :- + ( var(A) -> + ot____nom6(A), + wine(A), + kaon2namedobjects(A) + ; + ot____nom6(A), + wine(A), + kaon2namedobjects(A) + ). +stemilion(A) :- + ( var(A) -> + q65(A), + bordeaux(A) + ; + q65(A), + bordeaux(A) + ). +stemilion(A) :- + ( var(A) -> + stemilion(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + stemilion(B) + ). +sweetriesling(A) :- + ( var(A) -> + q71(A), + riesling(A) + ; + q71(A), + riesling(A) + ). +sweetriesling(A) :- + ( var(A) -> + sweetriesling(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + sweetriesling(B) + ). +sweetwine(A) :- + ( var(A) -> + q71(A), + wine(A) + ; + q71(A), + wine(A) + ). +sweetwine(A) :- + ( var(A) -> + sweetwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + sweetwine(B) + ). +tablewine(A) :- + whitetablewine(A). +tablewine(A) :- + redtablewine(A). +tablewine(A) :- + ( var(A) -> + q46(A), + wine(A) + ; + q46(A), + wine(A) + ). +tablewine(A) :- + ( var(A) -> + tablewine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + tablewine(B) + ). +texaswine(A) :- + ( var(A) -> + q74(A), + wine(A) + ; + q74(A), + wine(A) + ). +texaswine(A) :- + ( var(A) -> + texaswine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + texaswine(B) + ). +tours(A) :- + ( var(A) -> + q10(A), + loire(A) + ; + q10(A), + loire(A) + ). +tours(A) :- + ( var(A) -> + tours(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + tours(B) + ). +vintage(A) :- + hasvintageyear(A,_). +vintage(A) :- + ( var(A) -> + vintage(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + vintage(B) + ). +vintageyear(A) :- + hasvintageyear(_,A). +vintageyear(A) :- + ( var(A) -> + vintageyear(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + vintageyear(B) + ). +whitebordeaux(A) :- + ( var(A) -> + bordeaux(A), + whitewine(A) + ; + bordeaux(A), + whitewine(A) + ). +whitebordeaux(A) :- + ( var(A) -> + whitebordeaux(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + whitebordeaux(B) + ). +whiteburgundy(A) :- + meursault(A). +whiteburgundy(A) :- + ( var(A) -> + burgundy(A), + whitewine(A) + ; + burgundy(A), + whitewine(A) + ). +whiteburgundy(A) :- + ( var(A) -> + whiteburgundy(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + whiteburgundy(B) + ). +whiteloire(A) :- + ( var(A) -> + loire(A), + whitewine(A) + ; + loire(A), + whitewine(A) + ). +whiteloire(A) :- + ( var(A) -> + whiteloire(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + whiteloire(B) + ). +whitenonsweetwine(A) :- + ( var(A) -> + whitewine(A), + kaon2namedobjects(A) + ; + whitewine(A), + kaon2namedobjects(A) + ). +whitenonsweetwine(A) :- + ( var(A) -> + q36(A), + whitewine(A) + ; + q36(A), + whitewine(A) + ). +whitenonsweetwine(A) :- + ( var(A) -> + whitenonsweetwine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + whitenonsweetwine(B) + ). +whitenonsweetwine(A) :- + ( var(A) -> + ot____nom7(A), + whitewine(A), + kaon2namedobjects(A) + ; + ot____nom7(A), + whitewine(A), + kaon2namedobjects(A) + ). +whitetablewine(A) :- + ( var(A) -> + q21(A), + tablewine(A) + ; + q21(A), + tablewine(A) + ). +whitetablewine(A) :- + ( var(A) -> + whitetablewine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + whitetablewine(B) + ). +whitewine(A) :- + drywhitewine(A). +whitewine(A) :- + whiteburgundy(A). +whitewine(A) :- + whitebordeaux(A). +whitewine(A) :- + whiteloire(A). +whitewine(A) :- + whitenonsweetwine(A). +whitewine(A) :- + ( var(A) -> + q21(A), + wine(A) + ; + q21(A), + wine(A) + ). +whitewine(A) :- + ( var(A) -> + whitewine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + whitewine(B) + ). +wine(A) :- + q14(A). +wine(A) :- + texaswine(A). +wine(A) :- + q63(A). +wine(A) :- + q20(A). +wine(A) :- + tablewine(A). +wine(A) :- + haswinedescriptor(A,_). +wine(A) :- + q31(A). +wine(A) :- + q11(A). +wine(A) :- + q15(A). +wine(A) :- + earlyharvest(A). +wine(A) :- + sweetwine(A). +wine(A) :- + americanwine(A). +wine(A) :- + alsatianwine(A). +wine(A) :- + q0(A). +wine(A) :- + madefromgrape(A,_). +wine(A) :- + cabernetfranc(A). +wine(A) :- + semillonorsauvignonblanc(A). +wine(A) :- + beaujolais(A). +wine(A) :- + fullbodiedwine(A). +wine(A) :- + loire(A). +wine(A) :- + petitesyrah(A). +wine(A) :- + q12(A). +wine(A) :- + q45(A). +wine(A) :- + q7(A). +wine(A) :- + pinotnoir(A). +wine(A) :- + q35(A). +wine(A) :- + q24(A). +wine(A) :- + frenchwine(A). +wine(A) :- + meritage(A). +wine(A) :- + zinfandel(A). +wine(A) :- + californiawine(A). +wine(A) :- + pinotblanc(A). +wine(A) :- + q44(A). +wine(A) :- + bordeaux(A). +wine(A) :- + riesling(A). +wine(A) :- + hascolor(A,_). +wine(A) :- + redwine(A). +wine(A) :- + whitewine(A). +wine(A) :- + dessertwine(A). +wine(A) :- + q69(A). +wine(A) :- + q6(A). +wine(A) :- + drywine(A). +wine(A) :- + q13(A). +wine(A) :- + germanwine(A). +wine(A) :- + burgundy(A). +wine(A) :- + cabernetsauvignon(A). +wine(A) :- + q72(A). +wine(A) :- + q70(A). +wine(A) :- + q4(A). +wine(A) :- + italianwine(A). +wine(A) :- + chardonnay(A). +wine(A) :- + semillon(A). +wine(A) :- + q5(A). +wine(A) :- + rosewine(A). +wine(A) :- + q32(A). +wine(A) :- + lateharvest(A). +wine(A) :- + merlot(A). +wine(A) :- + ( var(A) -> + wine(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + wine(B) + ). +winebody(A) :- + ot____nom40(A). +winebody(A) :- + hasbody(_,A). +winebody(A) :- + ( var(A) -> + winebody(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + winebody(B) + ). +winecolor(A) :- + ot____nom9(A). +winecolor(A) :- + hascolor(_,A). +winecolor(A) :- + winedescriptor(A). +winecolor(A) :- + ( var(A) -> + winecolor(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + winecolor(B) + ). +winedescriptor(A) :- + winecolor(A). +winedescriptor(A) :- + winetaste(A). +winedescriptor(A) :- + haswinedescriptor(_,A). +winedescriptor(A) :- + ( var(A) -> + winedescriptor(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + winedescriptor(B) + ). +wineflavor(A) :- + hasflavor(_,A). +wineflavor(A) :- + ot____nom35(A). +wineflavor(A) :- + ( var(A) -> + wineflavor(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + wineflavor(B) + ). +winegrape(A) :- + madefromgrape(_,A). +winegrape(A) :- + ( var(A) -> + winegrape(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + winegrape(B) + ). +winesugar(A) :- + ot____nom18(A). +winesugar(A) :- + hassugar(_,A). +winesugar(A) :- + ( var(A) -> + winesugar(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + winesugar(B) + ). +winetaste(A) :- + wineflavor(A). +winetaste(A) :- + winesugar(A). +winetaste(A) :- + winebody(A). +winetaste(A) :- + winedescriptor(A). +winetaste(A) :- + ( var(A) -> + winetaste(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + winetaste(B) + ). +winery(A) :- + ( var(A) -> + wine(B), + hasmaker(B,A) + ; + hasmaker(B,A), + wine(B) + ). +winery(A) :- + ( var(A) -> + winery(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + winery(B) + ). +zinfandel(A) :- + ( var(A) -> + zinfandel(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + zinfandel(B) + ). +zinfandel(A) :- + ( var(A) -> + wine(A), + madefromgrape(A,B), + ot____nom20(B) + ; + wine(A), + madefromgrape(A,B), + ot____nom20(B) + ). +ot____nom1(A) :- + ( var(A) -> + q70(A), + kaon2namedobjects(A) + ; + q70(A), + kaon2namedobjects(A) + ). +ot____nom1(A) :- + ( var(A) -> + ot____nom1(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom1(B) + ). +ot____nom10(A) :- + ( var(A) -> + q73(A), + kaon2namedobjects(A) + ; + q73(A), + kaon2namedobjects(A) + ). +ot____nom10(A) :- + ( var(A) -> + ot____nom10(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom10(B) + ). +ot____nom11(A) :- + ( var(A) -> + q44(A), + kaon2namedobjects(A) + ; + q44(A), + kaon2namedobjects(A) + ). +ot____nom11(A) :- + ( var(A) -> + ot____nom11(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom11(B) + ). +ot____nom12(A) :- + ( var(A) -> + q31(A), + kaon2namedobjects(A) + ; + q31(A), + kaon2namedobjects(A) + ). +ot____nom12(A) :- + ( var(A) -> + ot____nom12(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom12(B) + ). +ot____nom13(A) :- + ( var(A) -> + q59(A), + kaon2namedobjects(A) + ; + q59(A), + kaon2namedobjects(A) + ). +ot____nom13(A) :- + ( var(A) -> + ot____nom13(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom13(B) + ). +ot____nom14(A) :- + ( var(A) -> + q66(A), + kaon2namedobjects(A) + ; + q66(A), + kaon2namedobjects(A) + ). +ot____nom14(A) :- + ( var(A) -> + ot____nom14(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom14(B) + ). +ot____nom15(A) :- + ( var(A) -> + q47(A), + kaon2namedobjects(A) + ; + q47(A), + kaon2namedobjects(A) + ). +ot____nom15(A) :- + ( var(A) -> + ot____nom15(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom15(B) + ). +ot____nom16(A) :- + ( var(A) -> + q55(A), + kaon2namedobjects(A) + ; + q55(A), + kaon2namedobjects(A) + ). +ot____nom16(A) :- + ( var(A) -> + ot____nom16(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom16(B) + ). +ot____nom17(A) :- + ( var(A) -> + q49(A), + kaon2namedobjects(A) + ; + q49(A), + kaon2namedobjects(A) + ). +ot____nom17(A) :- + ( var(A) -> + ot____nom17(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom17(B) + ). +ot____nom18(A) :- + winesugar(A). +ot____nom18(A) :- + ( var(A) -> + ot____nom18(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom18(B) + ). +ot____nom19(A) :- + ( var(A) -> + q57(A), + kaon2namedobjects(A) + ; + q57(A), + kaon2namedobjects(A) + ). +ot____nom19(A) :- + ( var(A) -> + ot____nom19(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom19(B) + ). +ot____nom2(A) :- + ( var(A) -> + q33(A), + kaon2namedobjects(A) + ; + q33(A), + kaon2namedobjects(A) + ). +ot____nom2(A) :- + ( var(A) -> + ot____nom2(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom2(B) + ). +ot____nom20(A) :- + ( var(A) -> + zinfandel(A), + kaon2namedobjects(A) + ; + zinfandel(A), + kaon2namedobjects(A) + ). +ot____nom20(A) :- + ( var(A) -> + ot____nom20(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom20(B) + ). +ot____nom21(A) :- + ( var(A) -> + q24(A), + kaon2namedobjects(A) + ; + q24(A), + kaon2namedobjects(A) + ). +ot____nom21(A) :- + ( var(A) -> + ot____nom21(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom21(B) + ). +ot____nom22(A) :- + ( var(A) -> + q18(A), + kaon2namedobjects(A) + ; + q18(A), + kaon2namedobjects(A) + ). +ot____nom22(A) :- + ( var(A) -> + ot____nom22(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom22(B) + ). +ot____nom23(A) :- + ( var(A) -> + q1(A), + kaon2namedobjects(A) + ; + q1(A), + kaon2namedobjects(A) + ). +ot____nom23(A) :- + ( var(A) -> + ot____nom23(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom23(B) + ). +ot____nom24(A) :- + ( var(A) -> + q63(A), + kaon2namedobjects(A) + ; + q63(A), + kaon2namedobjects(A) + ). +ot____nom24(A) :- + ( var(A) -> + ot____nom24(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom24(B) + ). +ot____nom25(A) :- + ( var(A) -> + petitesyrah(A), + kaon2namedobjects(A) + ; + petitesyrah(A), + kaon2namedobjects(A) + ). +ot____nom25(A) :- + ( var(A) -> + ot____nom25(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom25(B) + ). +ot____nom26(A) :- + ( var(A) -> + q22(A), + kaon2namedobjects(A) + ; + q22(A), + kaon2namedobjects(A) + ). +ot____nom26(A) :- + ( var(A) -> + ot____nom26(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom26(B) + ). +ot____nom27(A) :- + ( var(A) -> + semillon(A), + kaon2namedobjects(A) + ; + semillon(A), + kaon2namedobjects(A) + ). +ot____nom27(A) :- + ( var(A) -> + ot____nom27(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom27(B) + ). +ot____nom28(A) :- + ( var(A) -> + q0(A), + kaon2namedobjects(A) + ; + q0(A), + kaon2namedobjects(A) + ). +ot____nom28(A) :- + ( var(A) -> + ot____nom28(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom28(B) + ). +ot____nom29(A) :- + ( var(A) -> + q69(A), + kaon2namedobjects(A) + ; + q69(A), + kaon2namedobjects(A) + ). +ot____nom29(A) :- + ( var(A) -> + ot____nom29(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom29(B) + ). +ot____nom3(A) :- + ( var(A) -> + cabernetfranc(A), + kaon2namedobjects(A) + ; + cabernetfranc(A), + kaon2namedobjects(A) + ). +ot____nom3(A) :- + ( var(A) -> + ot____nom3(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom3(B) + ). +ot____nom30(A) :- + ( var(A) -> + q39(A), + kaon2namedobjects(A) + ; + q39(A), + kaon2namedobjects(A) + ). +ot____nom30(A) :- + ( var(A) -> + ot____nom30(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom30(B) + ). +ot____nom31(A) :- + ( var(A) -> + q16(A), + kaon2namedobjects(A) + ; + q16(A), + kaon2namedobjects(A) + ). +ot____nom31(A) :- + ( var(A) -> + ot____nom31(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom31(B) + ). +ot____nom32(A) :- + ( var(A) -> + q15(A), + kaon2namedobjects(A) + ; + q15(A), + kaon2namedobjects(A) + ). +ot____nom32(A) :- + ( var(A) -> + ot____nom32(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom32(B) + ). +ot____nom33(A) :- + ( var(A) -> + q14(A), + kaon2namedobjects(A) + ; + q14(A), + kaon2namedobjects(A) + ). +ot____nom33(A) :- + ( var(A) -> + ot____nom33(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom33(B) + ). +ot____nom34(A) :- + ( var(A) -> + q6(A), + kaon2namedobjects(A) + ; + q6(A), + kaon2namedobjects(A) + ). +ot____nom34(A) :- + ( var(A) -> + ot____nom34(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom34(B) + ). +ot____nom35(A) :- + wineflavor(A). +ot____nom35(A) :- + ( var(A) -> + ot____nom35(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom35(B) + ). +ot____nom36(A) :- + ( var(A) -> + q64(A), + kaon2namedobjects(A) + ; + q64(A), + kaon2namedobjects(A) + ). +ot____nom36(A) :- + ( var(A) -> + ot____nom36(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom36(B) + ). +ot____nom37(A) :- + ( var(A) -> + riesling(A), + kaon2namedobjects(A) + ; + riesling(A), + kaon2namedobjects(A) + ). +ot____nom37(A) :- + ( var(A) -> + ot____nom37(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom37(B) + ). +ot____nom38(A) :- + ( var(A) -> + q26(A), + kaon2namedobjects(A) + ; + q26(A), + kaon2namedobjects(A) + ). +ot____nom38(A) :- + ( var(A) -> + ot____nom38(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom38(B) + ). +ot____nom39(A) :- + ( var(A) -> + q72(A), + kaon2namedobjects(A) + ; + q72(A), + kaon2namedobjects(A) + ). +ot____nom39(A) :- + ( var(A) -> + ot____nom39(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom39(B) + ). +ot____nom4(A) :- + ( var(A) -> + q9(A), + kaon2namedobjects(A) + ; + q9(A), + kaon2namedobjects(A) + ). +ot____nom4(A) :- + ( var(A) -> + ot____nom4(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom4(B) + ). +ot____nom40(A) :- + winebody(A). +ot____nom40(A) :- + ( var(A) -> + ot____nom40(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom40(B) + ). +ot____nom41(A) :- + ( var(A) -> + q51(A), + kaon2namedobjects(A) + ; + q51(A), + kaon2namedobjects(A) + ). +ot____nom41(A) :- + ( var(A) -> + ot____nom41(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom41(B) + ). +ot____nom42(A) :- + ( var(A) -> + q37(A), + kaon2namedobjects(A) + ; + q37(A), + kaon2namedobjects(A) + ). +ot____nom42(A) :- + ( var(A) -> + ot____nom42(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom42(B) + ). +ot____nom43(A) :- + ( var(A) -> + q13(A), + kaon2namedobjects(A) + ; + q13(A), + kaon2namedobjects(A) + ). +ot____nom43(A) :- + ( var(A) -> + ot____nom43(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom43(B) + ). +ot____nom44(A) :- + ( var(A) -> + q29(A), + kaon2namedobjects(A) + ; + q29(A), + kaon2namedobjects(A) + ). +ot____nom44(A) :- + ( var(A) -> + ot____nom44(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom44(B) + ). +ot____nom45(A) :- + ( var(A) -> + q35(A), + kaon2namedobjects(A) + ; + q35(A), + kaon2namedobjects(A) + ). +ot____nom45(A) :- + ( var(A) -> + ot____nom45(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom45(B) + ). +ot____nom46(A) :- + ( var(A) -> + q42(A), + kaon2namedobjects(A) + ; + q42(A), + kaon2namedobjects(A) + ). +ot____nom46(A) :- + ( var(A) -> + ot____nom46(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom46(B) + ). +ot____nom47(A) :- + ( var(A) -> + q61(A), + kaon2namedobjects(A) + ; + q61(A), + kaon2namedobjects(A) + ). +ot____nom47(A) :- + ( var(A) -> + ot____nom47(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom47(B) + ). +ot____nom48(A) :- + ( var(A) -> + q4(A), + kaon2namedobjects(A) + ; + q4(A), + kaon2namedobjects(A) + ). +ot____nom48(A) :- + ( var(A) -> + ot____nom48(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom48(B) + ). +ot____nom49(A) :- + ( var(A) -> + q7(A), + kaon2namedobjects(A) + ; + q7(A), + kaon2namedobjects(A) + ). +ot____nom49(A) :- + ( var(A) -> + ot____nom49(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom49(B) + ). +ot____nom5(A) :- + ( var(A) -> + q12(A), + kaon2namedobjects(A) + ; + q12(A), + kaon2namedobjects(A) + ). +ot____nom5(A) :- + ( var(A) -> + ot____nom5(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom5(B) + ). +ot____nom50(A) :- + ( var(A) -> + sweetriesling(B), + hasflavor(B,A) + ; + hasflavor(B,A), + sweetriesling(B) + ). +ot____nom50(A) :- + ( var(A) -> + lateharvest(B), + hasflavor(B,A) + ; + hasflavor(B,A), + lateharvest(B) + ). +ot____nom50(A) :- + ( var(A) -> + chardonnay(B), + hasflavor(B,A) + ; + hasflavor(B,A), + chardonnay(B) + ). +ot____nom50(A) :- + ( var(A) -> + zinfandel(B), + hasflavor(B,A) + ; + hasflavor(B,A), + zinfandel(B) + ). +ot____nom50(A) :- + ( var(A) -> + icewine(B), + hasflavor(B,A) + ; + hasflavor(B,A), + icewine(B) + ). +ot____nom50(A) :- + ( var(A) -> + cabernetsauvignon(B), + hasflavor(B,A) + ; + hasflavor(B,A), + cabernetsauvignon(B) + ). +ot____nom50(A) :- + ( var(A) -> + petitesyrah(B), + hasflavor(B,A) + ; + hasflavor(B,A), + petitesyrah(B) + ). +ot____nom50(A) :- + ( var(A) -> + ot____nom50(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom50(B) + ). +ot____nom51(A) :- + ( var(A) -> + icewine(B), + hasbody(B,A) + ; + hasbody(B,A), + icewine(B) + ). +ot____nom51(A) :- + ( var(A) -> + cheninblanc(B), + hasbody(B,A) + ; + hasbody(B,A), + cheninblanc(B) + ). +ot____nom51(A) :- + ( var(A) -> + chardonnay(B), + hasbody(B,A) + ; + hasbody(B,A), + chardonnay(B) + ). +ot____nom51(A) :- + ( var(A) -> + cabernetsauvignon(B), + hasbody(B,A) + ; + hasbody(B,A), + cabernetsauvignon(B) + ). +ot____nom51(A) :- + ( var(A) -> + semillonorsauvignonblanc(B), + hasbody(B,A) + ; + hasbody(B,A), + semillonorsauvignonblanc(B) + ). +ot____nom51(A) :- + ( var(A) -> + petitesyrah(B), + hasbody(B,A) + ; + hasbody(B,A), + petitesyrah(B) + ). +ot____nom51(A) :- + ( var(A) -> + zinfandel(B), + hasbody(B,A) + ; + hasbody(B,A), + zinfandel(B) + ). +ot____nom51(A) :- + ( var(A) -> + ot____nom51(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom51(B) + ). +ot____nom52(A) :- + ( var(A) -> + sauternes(A), + kaon2namedobjects(A) + ; + sauternes(A), + kaon2namedobjects(A) + ). +ot____nom52(A) :- + ( var(A) -> + ot____nom52(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom52(B) + ). +ot____nom53(A) :- + ( var(A) -> + dessertwine(B), + hassugar(B,A) + ; + hassugar(B,A), + dessertwine(B) + ). +ot____nom53(A) :- + ( var(A) -> + ot____nom53(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom53(B) + ). +ot____nom54(A) :- + ( var(A) -> + q32(A), + kaon2namedobjects(A) + ; + q32(A), + kaon2namedobjects(A) + ). +ot____nom54(A) :- + ( var(A) -> + ot____nom54(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom54(B) + ). +ot____nom55(A) :- + ( var(A) -> + q20(A), + kaon2namedobjects(A) + ; + q20(A), + kaon2namedobjects(A) + ). +ot____nom55(A) :- + ( var(A) -> + ot____nom55(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom55(B) + ). +ot____nom56(A) :- + ( var(A) -> + q45(A), + kaon2namedobjects(A) + ; + q45(A), + kaon2namedobjects(A) + ). +ot____nom56(A) :- + ( var(A) -> + ot____nom56(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom56(B) + ). +ot____nom57(A) :- + ( var(A) -> + port(A), + kaon2namedobjects(A) + ; + port(A), + kaon2namedobjects(A) + ). +ot____nom57(A) :- + ( var(A) -> + ot____nom57(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom57(B) + ). +ot____nom58(A) :- + ( var(A) -> + q11(A), + kaon2namedobjects(A) + ; + q11(A), + kaon2namedobjects(A) + ). +ot____nom58(A) :- + ( var(A) -> + ot____nom58(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom58(B) + ). +ot____nom59(A) :- + ( var(A) -> + merlot(B), + hasbody(B,A) + ; + hasbody(B,A), + merlot(B) + ). +ot____nom59(A) :- + ( var(A) -> + dryriesling(B), + hasbody(B,A) + ; + hasbody(B,A), + dryriesling(B) + ). +ot____nom59(A) :- + ( var(A) -> + chianti(B), + hasbody(B,A) + ; + hasbody(B,A), + chianti(B) + ). +ot____nom59(A) :- + ( var(A) -> + ot____nom59(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom59(B) + ). +ot____nom6(A) :- + ( var(A) -> + q68(B), + madefromgrape(B,A) + ; + madefromgrape(B,A), + q68(B) + ). +ot____nom6(A) :- + ( var(A) -> + ot____nom6(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom6(B) + ). +ot____nom60(A) :- + ( var(A) -> + chianti(A), + kaon2namedobjects(A) + ; + chianti(A), + kaon2namedobjects(A) + ). +ot____nom60(A) :- + ( var(A) -> + ot____nom60(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom60(B) + ). +ot____nom61(A) :- + ( var(A) -> + chianti(A), + kaon2namedobjects(A) + ; + chianti(A), + kaon2namedobjects(A) + ). +ot____nom61(A) :- + ( var(A) -> + ot____nom61(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom61(B) + ). +ot____nom62(A) :- + ( var(A) -> + redbordeaux(B), + madefromgrape(B,A) + ; + madefromgrape(B,A), + redbordeaux(B) + ). +ot____nom62(A) :- + ( var(A) -> + ot____nom62(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom62(B) + ). +ot____nom63(A) :- + ( var(A) -> + whiteloire(B), + madefromgrape(B,A) + ; + madefromgrape(B,A), + whiteloire(B) + ). +ot____nom63(A) :- + ( var(A) -> + ot____nom63(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom63(B) + ). +ot____nom64(A) :- + ( var(A) -> + merlot(B), + hasflavor(B,A) + ; + hasflavor(B,A), + merlot(B) + ). +ot____nom64(A) :- + ( var(A) -> + ot____nom64(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom64(B) + ). +ot____nom7(A) :- + ( var(A) -> + q36(B), + hassugar(B,A) + ; + hassugar(B,A), + q36(B) + ). +ot____nom7(A) :- + ( var(A) -> + ot____nom7(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom7(B) + ). +ot____nom8(A) :- + ( var(A) -> + meritage(B), + madefromgrape(B,A) + ; + madefromgrape(B,A), + meritage(B) + ). +ot____nom8(A) :- + ( var(A) -> + ot____nom8(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom8(B) + ). +ot____nom9(A) :- + winecolor(A). +ot____nom9(A) :- + ( var(A) -> + ot____nom9(B), + kaon2equal(A,B) + ; + kaon2equal(A,B), + ot____nom9(B) + ). +adjacentregion(A,B) :- + adjacentregion(B,A). +adjacentregion(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + adjacentregion(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + adjacentregion(C,B) + ) + ; + ( nonvar(B) -> + adjacentregion(C,B), + kaon2equal(A,C) + ) + ; + adjacentregion(C,B), + kaon2equal(A,C) + ). +adjacentregion(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + adjacentregion(A,C), + kaon2equal(B,C) + ; + adjacentregion(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + adjacentregion(A,C) + ) + ; + adjacentregion(A,C), + kaon2equal(B,C) + ). +hasbody(A,A) :- + q45(A), + kaon2namedobjects(A). +hasbody(A,A) :- + wine(A), + kaon2namedobjects(A). +hasbody(A,A) :- + q35(A), + kaon2namedobjects(A). +hasbody(A,A) :- + q7(A), + kaon2namedobjects(A). +hasbody(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasbody(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + hasbody(C,B) + ) + ; + ( nonvar(B) -> + hasbody(C,B), + kaon2equal(A,C) + ) + ; + hasbody(C,B), + kaon2equal(A,C) + ). +hasbody(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasbody(A,C), + kaon2equal(B,C) + ; + hasbody(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + hasbody(A,C) + ) + ; + hasbody(A,C), + kaon2equal(B,C) + ). +hascolor(A,A) :- + q0(A), + kaon2namedobjects(A). +hascolor(A,A) :- + q15(A), + kaon2namedobjects(A). +hascolor(A,A) :- + wine(A), + kaon2namedobjects(A). +hascolor(A,A) :- + q12(A), + kaon2namedobjects(A). +hascolor(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hascolor(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + hascolor(C,B) + ) + ; + ( nonvar(B) -> + hascolor(C,B), + kaon2equal(A,C) + ) + ; + hascolor(C,B), + kaon2equal(A,C) + ). +hascolor(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hascolor(A,C), + kaon2equal(B,C) + ; + hascolor(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + hascolor(A,C) + ) + ; + hascolor(A,C), + kaon2equal(B,C) + ). +hasflavor(A,A) :- + q4(A), + kaon2namedobjects(A). +hasflavor(A,A) :- + q11(A), + kaon2namedobjects(A). +hasflavor(A,A) :- + q20(A), + kaon2namedobjects(A). +hasflavor(A,A) :- + wine(A), + kaon2namedobjects(A). +hasflavor(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasflavor(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + hasflavor(C,B) + ) + ; + ( nonvar(B) -> + hasflavor(C,B), + kaon2equal(A,C) + ) + ; + hasflavor(C,B), + kaon2equal(A,C) + ). +hasflavor(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasflavor(A,C), + kaon2equal(B,C) + ; + hasflavor(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + hasflavor(A,C) + ) + ; + hasflavor(A,C), + kaon2equal(B,C) + ). +hasmaker(A,B) :- + produceswine(B,A). +hasmaker(A,A) :- + wine(A), + kaon2namedobjects(A). +hasmaker(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasmaker(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + hasmaker(C,B) + ) + ; + ( nonvar(B) -> + hasmaker(C,B), + kaon2equal(A,C) + ) + ; + hasmaker(C,B), + kaon2equal(A,C) + ). +hasmaker(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasmaker(A,C), + kaon2equal(B,C) + ; + hasmaker(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + hasmaker(A,C) + ) + ; + hasmaker(A,C), + kaon2equal(B,C) + ). +hassugar(A,A) :- + wine(A), + kaon2namedobjects(A). +hassugar(A,A) :- + q31(A), + kaon2namedobjects(A). +hassugar(A,A) :- + whitewine(A), + kaon2namedobjects(A). +hassugar(A,A) :- + q70(A), + kaon2namedobjects(A). +hassugar(A,A) :- + q32(A), + kaon2namedobjects(A). +hassugar(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hassugar(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + hassugar(C,B) + ) + ; + ( nonvar(B) -> + hassugar(C,B), + kaon2equal(A,C) + ) + ; + hassugar(C,B), + kaon2equal(A,C) + ). +hassugar(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hassugar(A,C), + kaon2equal(B,C) + ; + hassugar(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + hassugar(A,C) + ) + ; + hassugar(A,C), + kaon2equal(B,C) + ). +hasvintageyear(A,A) :- + vintage(A), + kaon2namedobjects(A). +hasvintageyear(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasvintageyear(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + hasvintageyear(C,B) + ) + ; + ( nonvar(B) -> + hasvintageyear(C,B), + kaon2equal(A,C) + ) + ; + hasvintageyear(C,B), + kaon2equal(A,C) + ). +hasvintageyear(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasvintageyear(A,C), + kaon2equal(B,C) + ; + hasvintageyear(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + hasvintageyear(A,C) + ) + ; + hasvintageyear(A,C), + kaon2equal(B,C) + ). +haswinedescriptor(A,B) :- + hasbody(A,B). +haswinedescriptor(A,B) :- + hascolor(A,B). +haswinedescriptor(A,B) :- + hasflavor(A,B). +haswinedescriptor(A,B) :- + hassugar(A,B). +haswinedescriptor(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + haswinedescriptor(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + haswinedescriptor(C,B) + ) + ; + ( nonvar(B) -> + haswinedescriptor(C,B), + kaon2equal(A,C) + ) + ; + haswinedescriptor(C,B), + kaon2equal(A,C) + ). +haswinedescriptor(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + haswinedescriptor(A,C), + kaon2equal(B,C) + ; + haswinedescriptor(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + haswinedescriptor(A,C) + ) + ; + haswinedescriptor(A,C), + kaon2equal(B,C) + ). +locatedin(A,A) :- + q57(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q37(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q61(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q59(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q33(A), + kaon2namedobjects(A). +locatedin(A,A) :- + wine(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q18(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q49(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q42(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q9(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q22(A), + kaon2namedobjects(A). +locatedin(A,A) :- + chianti(A), + kaon2namedobjects(A). +locatedin(A,A) :- + port(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q26(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q51(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q55(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q16(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q73(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q29(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q1(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q47(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q39(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q64(A), + kaon2namedobjects(A). +locatedin(A,A) :- + sauternes(A), + kaon2namedobjects(A). +locatedin(A,A) :- + q66(A), + kaon2namedobjects(A). +locatedin(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + locatedin(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + locatedin(C,B) + ) + ; + ( nonvar(B) -> + locatedin(C,B), + kaon2equal(A,C) + ) + ; + locatedin(C,B), + kaon2equal(A,C) + ). +locatedin(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + locatedin(A,C), + kaon2equal(B,C) + ; + locatedin(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + locatedin(A,C) + ) + ; + locatedin(A,C), + kaon2equal(B,C) + ). +locatedin(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + locatedin(A,C), + locatedin(C,B) + ; + locatedin(A,C), + locatedin(C,B) + ) + ; + ( nonvar(B) -> + locatedin(C,B), + locatedin(A,C) + ) + ; + locatedin(A,C), + locatedin(C,B) + ). +locatedin(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + locatedin(A,C), + locatedin(C,B), + kaon2namedobjects(B), + kaon2namedobjects(C), + kaon2namedobjects(A) + ; + locatedin(A,C), + locatedin(C,B), + kaon2namedobjects(B), + kaon2namedobjects(C), + kaon2namedobjects(A) + ) + ; + ( nonvar(B) -> + locatedin(C,B), + kaon2namedobjects(B), + kaon2namedobjects(C), + locatedin(A,C), + kaon2namedobjects(A) + ) + ; + locatedin(A,C), + locatedin(C,B), + kaon2namedobjects(B), + kaon2namedobjects(C), + kaon2namedobjects(A) + ). +madefromfruit(A,B) :- + madefromgrape(A,B). +madefromfruit(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + madefromfruit(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + madefromfruit(C,B) + ) + ; + ( nonvar(B) -> + madefromfruit(C,B), + kaon2equal(A,C) + ) + ; + madefromfruit(C,B), + kaon2equal(A,C) + ). +madefromfruit(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + madefromfruit(A,C), + kaon2equal(B,C) + ; + madefromfruit(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + madefromfruit(A,C) + ) + ; + madefromfruit(A,C), + kaon2equal(B,C) + ). +madefromgrape(A,B) :- + madeintowine(B,A). +madefromgrape(A,A) :- + riesling(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + wine(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q72(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q5(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + semillon(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q14(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q24(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + zinfandel(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q6(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + petitesyrah(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q13(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + chianti(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + cabernetfranc(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q69(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q44(A), + kaon2namedobjects(A). +madefromgrape(A,A) :- + q63(A), + kaon2namedobjects(A). +madefromgrape(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + madefromgrape(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + madefromgrape(C,B) + ) + ; + ( nonvar(B) -> + madefromgrape(C,B), + kaon2equal(A,C) + ) + ; + madefromgrape(C,B), + kaon2equal(A,C) + ). +madefromgrape(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + madefromgrape(A,C), + kaon2equal(B,C) + ; + madefromgrape(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + madefromgrape(A,C) + ) + ; + madefromgrape(A,C), + kaon2equal(B,C) + ). +madeintowine(A,B) :- + madefromgrape(B,A). +madeintowine(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + madeintowine(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + madeintowine(C,B) + ) + ; + ( nonvar(B) -> + madeintowine(C,B), + kaon2equal(A,C) + ) + ; + madeintowine(C,B), + kaon2equal(A,C) + ). +madeintowine(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + madeintowine(A,C), + kaon2equal(B,C) + ; + madeintowine(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + madeintowine(A,C) + ) + ; + madeintowine(A,C), + kaon2equal(B,C) + ). +produceswine(A,B) :- + hasmaker(B,A). +produceswine(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + produceswine(C,B), + kaon2equal(A,C) + ; + kaon2equal(A,C), + produceswine(C,B) + ) + ; + ( nonvar(B) -> + produceswine(C,B), + kaon2equal(A,C) + ) + ; + produceswine(C,B), + kaon2equal(A,C) + ). +produceswine(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + produceswine(A,C), + kaon2equal(B,C) + ; + produceswine(A,C), + kaon2equal(B,C) + ) + ; + ( nonvar(B) -> + kaon2equal(B,C), + produceswine(A,C) + ) + ; + produceswine(A,C), + kaon2equal(B,C) + ). +kaon2hu(A) :- + kaon2namedobjects(A). +kaon2equal(A,A) :- + kaon2hu(A). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasflavor(C,A), + hasflavor(C,B) + ; + hasflavor(C,A), + hasflavor(C,B) + ) + ; + ( nonvar(B) -> + hasflavor(C,B), + hasflavor(C,A) + ) + ; + hasflavor(C,A), + hasflavor(C,B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hassugar(C,A), + hassugar(C,B) + ; + hassugar(C,A), + hassugar(C,B) + ) + ; + ( nonvar(B) -> + hassugar(C,B), + hassugar(C,A) + ) + ; + hassugar(C,A), + hassugar(C,B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasvintageyear(C,A), + hasvintageyear(C,B) + ; + hasvintageyear(C,A), + hasvintageyear(C,B) + ) + ; + ( nonvar(B) -> + hasvintageyear(C,B), + hasvintageyear(C,A) + ) + ; + hasvintageyear(C,A), + hasvintageyear(C,B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hascolor(C,A), + hascolor(C,B) + ; + hascolor(C,A), + hascolor(C,B) + ) + ; + ( nonvar(B) -> + hascolor(C,B), + hascolor(C,A) + ) + ; + hascolor(C,A), + hascolor(C,B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasmaker(C,A), + hasmaker(C,B) + ; + hasmaker(C,A), + hasmaker(C,B) + ) + ; + ( nonvar(B) -> + hasmaker(C,B), + hasmaker(C,A) + ) + ; + hasmaker(C,A), + hasmaker(C,B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + hasbody(C,A), + hasbody(C,B) + ; + hasbody(C,A), + hasbody(C,B) + ) + ; + ( nonvar(B) -> + hasbody(C,B), + hasbody(C,A) + ) + ; + hasbody(C,A), + hasbody(C,B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + madefromgrape(C,A), + madefromgrape(C,B), + q3(C) + ; + madefromgrape(C,A), + madefromgrape(C,B), + q3(C) + ) + ; + ( nonvar(B) -> + madefromgrape(C,B), + q3(C), + madefromgrape(C,A) + ) + ; + q3(C), + madefromgrape(C,A), + madefromgrape(C,B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + kaon2equal(B,A), + kaon2hu(A), + kaon2hu(B) + ; + kaon2equal(B,A), + kaon2hu(A), + kaon2hu(B) + ) + ; + ( nonvar(B) -> + kaon2equal(B,A), + kaon2hu(A), + kaon2hu(B) + ) + ; + kaon2equal(B,A), + kaon2hu(A), + kaon2hu(B) + ). +kaon2equal(A,B) :- + ( nonvar(A) -> + ( nonvar(B) -> + kaon2equal(A,C), + kaon2equal(C,B), + kaon2hu(A), + kaon2hu(C), + kaon2hu(B) + ; + kaon2equal(A,C), + kaon2equal(C,B), + kaon2hu(A), + kaon2hu(C), + kaon2hu(B) + ) + ; + ( nonvar(B) -> + kaon2equal(C,B), + kaon2hu(C), + kaon2hu(B), + kaon2equal(A,C), + kaon2hu(A) + ) + ; + kaon2equal(A,C), + kaon2equal(C,B), + kaon2hu(A), + kaon2hu(C), + kaon2hu(B) + ). + + +/* ---------------------------------------------------------------------------- + * Benchmark Query: + *----------------------------------------------------------------------------- + */ + +bench :- californiawine(_), fail. +bench. + +/* ---------------------------------------------------------------------------- + * List of Test Data Files: + *----------------------------------------------------------------------------- + */ + +test_file(wine_table, '../data/wine_data.P'). + + +/*============================================================================= + * The rest is the same for all YAP benchmarks: + *============================================================================= + */ + + +/*----------------------------------------------------------------------------- + * Main Predicate: Run the Test and Write File RUN__BENCH_RESULT. + *----------------------------------------------------------------------------- + */ + +test(BenchID) :- + test_file(BenchID, Filename), + open('RUN_BENCH__RESULT', write, Output), + % Write Benchmark ID to output file: + write(Output, BenchID), + write(Output, '\t'), + % Get times before Load (Real in ms, CPU in s): + statistics(walltime, [Real0,_]), + CPU0 is cputime, + % Load Data: + [Filename], + % Get times after Load: + CPU1 is cputime, + statistics(walltime, [Real1,_]), + % Compute Load times: + LoadCPU is floor((CPU1 - CPU0) * 1000), + LoadReal is Real1 - Real0, + % Write load CPU time to output file: + write(Output, LoadCPU), + write(Output, '\t'), + flush_output(Output), + % Get times before Exec (Real in ms, CPU in s): + statistics(walltime, [Real3,_]), + CPU3 is cputime, + % NOW THE BENCHMARK QUERY: + bench, + % Get times after Exec: + CPU4 is cputime, + statistics(walltime, [Real4,_]), + % Compute Times for Benchmark Execution: + ExecCPU is floor((CPU4 - CPU3) * 1000), + ExecReal is Real4 - Real3, + % Write Exec CPU time to output file: + write(Output, ExecCPU), + write(Output, '\t'), + % Write total CPU time to output file: + TotalCPU is floor(CPU4 * 1000), + write(Output, TotalCPU), + write(Output, '\t'), + % Compare CPU times with real times, write "Warn" status if strange: + status(LoadCPU, LoadReal, ExecCPU, ExecReal, Status), + write(Output, Status), + write(Output, '\t'), + close(Output). + +/*----------------------------------------------------------------------------- + * Comparison of Wallclock Time and CPU Time: + *----------------------------------------------------------------------------- + */ + +/* If the two times differ to much, we output status 'Warn': */ + +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn1') :- + LoadCPU > LoadReal, + !. +status(LoadCPU, LoadReal, _ExecCPU, _ExecReal, 'Warn2') :- + LoadReal > LoadCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn3') :- + ExecCPU > ExecReal, + !. +status(_LoadCPU, _LoadReal, ExecCPU, ExecReal, 'Warn4') :- + ExecReal > ExecCPU * 1.15, + !. +status(_LoadCPU, _LoadReal, _ExecCPU, _ExecReal, 'OK'). + + +/*----------------------------------------------------------------------------- + * Main Goal: Access Command Line Argument and Call Test Predicate: + *----------------------------------------------------------------------------- + */ + +go :- current_prolog_flag(argv, ArgumentList), + ArgumentList = [BenchID | _], + test(BenchID). -- GitLab