klauzule prologowe

0

Witam, mam problem z zadaniem:

"Wyraź poniższe twierdzenia w postaci klauzul prologowych. Wprowadź odpowiednie predykaty, ale użyj jedynie atomów my_cat i me i nie używaj funktorów:

  1. Ptaki lubią dżdżownice.
  2. Koty lubią ryby.
  3. Przyjaciele lubią się nawzajem.
  4. Mój kot jest moim przyjacielem.
  5. Mój kot jada wszystko, to, co lubi. "

Czyli jeśli nie mogę używać atomów innych niż te 2 podane to to zadanie jest moim zdaniem niewykonalne.
Ja myślałem o czymś takim:
3. przyjaciele(X,Y) :- lubić(X,Y), lubić(Y,X)
4. przyjaciele(my_cat, me)
5. jeść(my_cat, X) :- lubić(my_cat, X)

Ale 1 i 2 nie mam pojęcia jak zapisać.
Poza tym w 3 rożnych źródłach są 3 różne definicje atomu.
Proszę o pomoc/sugestię/wskazanie błędu w rozumowaniu.

0

Faktycznie, bez użycia atomów to zadanie wygląda lekko niewykonalnie. Mój typ wyglądałby tak:

lubi(X, Y) :- ptak(X), dżydżownica(Y).
lubi(X, Y) :- kot(X), ryba(Y).

Ale predykatów ptak, dżydżownica, kot i ryba nie da się dalej ukonkretnić...

Być może drugie można trochę "oszukać" wykorzysując piątkę, ale nie mam pomysu jak (i wątpie żeby się dało) zrobić to bez atomu ryba...

Btw. w 4. użyłeś funktora, a zadanie tego wprost zakazuje.
Ogólnie moim zdaniem to zadanie jest bez sensu (ani realistyczne, ani przydatne w życiu... Jeśli w ogóle wykonalne, to i tak sztuka dla sztuki) ;)

0

A mógłbyś mi wytłumaczyć czym jest funktor a czym jest atom? Bo w różnych źródłach jest różnie napisane. Np. w jednej książce piszą że atomem (odwołując się do zadania) jest np. ryba, dżdżownica, lubi, przyjaciele itp. A o funktorze nie mogę za bardzo nic znaleźć.

0

Książka ma mnie-więcej rację jeśli chodzi o atom.

Atom to po prostu ciąg znaków, pojedyńcza wartość.
Wygrzebałem z nieoficjalnej dokumentacji Prologa:

An atom, in Prolog, means a single data item. It may be of one of three types:

* a string atom, like 'This is a string' or
* a symbol, like likes, john, and pizza, in likes(john, pizza). Atoms of this type must start with a lower case letter. They can include digits (after the initial lower-case letter) and the underscore character (_).
* strings of special characters, like <--->, ..., ===>. When using atoms of this type, some care is needed to avoid using strings of special characters with a predefined meaning, like the neck symbol :-, the cut symbol !, and various arithmetic and comparison operators.
  The available special characters for constructing this class of atom are: +, -, *, /, <, >, =, :, ., &, _, and ~. 

Numbers, in Prolog, are not considered to be atoms.

atom is also the name of a built-in predicate that tests whether its single argument is an atom.

?- atom(pizza).
true.

?- atom(likes(mary, pizza)).
false.

?- atom(<-->).
true.

?- atom(235).
false.

Z funktorami jest gorzej:
Funktor to atom na początku wyrażenia - cytując dokumentację wyrażenie likes(mary, pizza) definiuje funktor likes - tekst z dokumentacji:

In Prolog, the word functor is used to refer to the atom at the start of a structure. For example, in likes(mary, pizza), likes is the functor. In a more complex structure, like

persondata(name(smith, john), date(28, feb, 1963))
the top-level functor is termed the principal functor - in this case persondata - There is also a built-in predicate called functor, used to extract the functor and arity of a structure.

There is also a built-in predicate functor with three arguments: functor(Term, Functor, Arity), which succeeds if Term is a term with functor Functor and arity Arity. Examples:

?- functor(likes(mary, pizza), Functor, Arity).
Functor = likes
Arity = 2 

?- functor(likes(X, Y), Functor, Arity).
X = _G180
Y = _G181
Functor = likes
Arity = 2

?- functor(likes, Functor, Arity).
Functor = likes
Arity = 0 

?- functor(X, likes, 2).
X = likes(_G232, _G233) 

Jeśli chcesz samodzielnie poeksperymentować, polecam wbudowane predykaty functor i atom - przykład użycia:

% kod:
ma_kota(A) :- A = "Ala".
asdf(foo).

% wyniki zapytań
4 ?- functor(asdf, Functor, Arity).
Functor = asdf,
Arity = 0.

5 ?- functor(ma_kota, Functor, Arity).
Functor = ma_kota,
Arity = 0.

Źródło i do poczytania więcej jeśli chcesz - http://www.cse.unsw.edu.au/~billw/prologdict.html .

Tak naprawdę to napisanie czegokolwiek w prologu bez użycia funktorów (jak i atomów) jest niemożliwe, bo prolog mówi że ptak(X) i lubi(X, Y) to również funktory...

0

Czyli to zadanie jest nie do zrobienia?

0

Dobre pytanie... Możliwe że źle rozumiem zadanie, albo że istnieją dwie równoważne definicje funktora i atomu, etc, etc ale... wątpie.
Na Twoim miejscu zapytałbym się wykładowcy/nauczyciela/zlecającego/wtf o co dokładnie chodzi...

edit: tak mi do głowy jeszcze przyszło że ściśle rzecz ujmując to lubi, przyjaciel to też atomy...

1 użytkowników online, w tym zalogowanych: 0, gości: 1