@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix : <foo:bla#>.

## ... by Wolfgang May, Nov. 2008

# 00. Fuenf Haeuser stehen in einer Reihe.mit je einer Farbe
# 01. Jedes Haus hat eine andere Farbe
# 02. In jedem Haus wohnt eine Person einer anderen Nationalitaet
# 03. Jeder Hausbewohner bevorzugt ein bestimmtes Getraenk, raucht eine
#  bestimmte Zigarettenmarke und haelt ein bestimmtes Haustier
# 04. KEINE der 5 Personen trinkt das gleiche Getraenk, raucht die gleichen
#  Zigaretten oder haelt das gleiche Tier, wie einer seiner Nachbarn

# Frage: Wem gehoert der Fisch????

:Houses a owl:Class; 
  owl:equivalentClass [ owl:oneOf (:one :two :three :four :five) ].

:one :leftOf :two.
:two :leftOf :three.
:three :leftOf :four.
:four :leftOf :five.

:Houses rdfs:subClassOf
   [ a owl:Restriction; owl:onProperty :nextTo; owl:maxCardinality 2 ].
:OuterHouse a owl:Class; owl:equivalentClass
  [ a owl:Restriction; owl:onProperty :nextTo; owl:cardinality 1 ].
:NoRight a owl:Class ; owl:intersectionOf 
  ( [ a owl:Restriction; owl:onProperty :leftOf; owl:cardinality 0 ] 
    :OuterHouse ).
:five a :NoRight.

:NoLeft rdf:type owl:Class ; owl:intersectionOf 
  ( [ a owl:Restriction; owl:onProperty :rightOf; owl:cardinality 0 ] 
    :OuterHouse ).
:one a :NoLeft.

:rightOf a owl:ObjectProperty; a owl:FunctionalProperty; owl:inverseOf :leftOf;
   rdfs:subPropertyOf :nextTo.
:leftOf a owl:ObjectProperty; a owl:FunctionalProperty; rdfs:subPropertyOf :nextTo.
:nextTo a owl:ObjectProperty; rdfs:domain :Houses; rdfs:range :Houses.

:Nationalities a owl:Class; 
  owl:equivalentClass [ owl:oneOf (:gb :s :dk :n :d) ].
:Colors a owl:Class; 
  owl:equivalentClass [ owl:oneOf (:red :green :white :yellow :blue) ].
:Cigarettes a owl:Class; 
  owl:equivalentClass 
    [ owl:oneOf (:pallmall :dunhill :marlboro :winfield :rothmans) ].
:Drinks a owl:Class;
  owl:equivalentClass [ owl:oneOf (:tea :coffee :water :milk :beer) ].
:Animals a owl:Class; 
  owl:equivalentClass [ owl:oneOf (:dog :bird :fish :cat :horse) ].

# the allDifferent are not necessary, but save a lot of reasoning time!
# (with: 3-6sec, without 2:30-233:26 min (computer: login, 30.9.2011))

owl:AllDifferent owl:distinctMembers (:one :two :three :four :five).
owl:AllDifferent owl:distinctMembers (:gb :s :dk :n :d).
owl:AllDifferent owl:distinctMembers (:red :green :white :yellow :blue).
owl:AllDifferent owl:distinctMembers 
      (:pallmall :dunhill :marlboro :winfield :rothmans).
owl:AllDifferent owl:distinctMembers (:tea :coffee :water :milk :beer).
owl:AllDifferent owl:distinctMembers (:dog :bird :fish :cat :horse).

:Houses owl:equivalentClass :Nationalities.
:Houses owl:equivalentClass :Colors.
:Houses owl:equivalentClass :Cigarettes.
:Houses owl:equivalentClass :Drinks.
:Houses owl:equivalentClass :Animals.

# Die Hinweise:

# 01. Der Brite lebt im roten Haus
:gb owl:sameAs :red.
# 02. Der Schwede haelt einen Hund
:s owl:sameAs :dog.
# 03. Der Daene trinkt gerne Tee
:dk owl:sameAs :tea.
# 04. Das gruene Haus steht direkt links vom weissen Haus
:green :leftOf :white.
# 05. Der Besitzer des gruenen Hauses trinkt gerne Kaffee
:green owl:sameAs :coffee.
# 06. Die Person, die Pall Mall raucht, haelt einen Vogel
:pallmall owl:sameAs :bird.
# 07. Der Mann, der im mittleren Haus wohnt, trinkt gerne Milch
:three owl:sameAs :milk.
# 08. Der Besitzer des gelben Hauses raucht Dunhill
:yellow owl:sameAs :dunhill.
# 09. Der Norweger wohnt in dem ganz links stehenden Haus
:n owl:sameAs :one.
# 10. Der Marlboro-Raucher wohnt neben dem, der eine Katze haelt
:marlboro :nextTo :cat. 
# 11. Der Mann, der ein Pferd haelt, wohnt neben dem, der Dunhill raucht
:horse :nextTo :dunhill.
# 12. Der Winfield-Raucher trinkt gerne Bier
:winfield owl:sameAs :beer.
# 13. Neben dem blauen Haus wohnt der Norweger
:blue :nextTo :n.
# 14. Der Deutsche raucht Rothmans
:d owl:sameAs :rothmans.
# 15. Derjenige, der Marlboro raucht, hat einen Nachbarn, der Wasser trinkt
:marlboro :nextTo :water.
