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