Как найти все универсальные факты в прологе?

На Прологе я могу написать

 child(martha,charlotte). 
 child(charlotte,caroline). 
 child(caroline,laura). 
 child(laura,rose). 

 descend(X,Y)  :-
    child(X,Y).
 descend(X,Y)  :-
    child(X,Z), 
    descend(Z,Y).

А потом напиши

?-  findall(X,descend(martha,X),Z).

и получить четыре решения

Z  =  [charlotte,caroline,laura,rose]

Но если я потом добавлю универсальный факт

likes(X,pomegranate).

и попробуйте

 ?-  findall(X,likes(X, pomegranate),Z).

Я получил:

 Z = [_G17].

Что это _G17? Что мне нужно изменить, чтобы получить практически все переменные? ( поскольку likes(X,pomegranate) должно означать, что все любят гранат... правильно?):

Z  =  [martha,charlotte,caroline,laura,rose]

person Luxspes    schedule 23.04.2016    source источник
comment
Кстати, это не домашняя работа, это я пытаюсь заново выучить Пролог в качестве хобби.   -  person Luxspes    schedule 23.04.2016


Ответы (1)


Два решения. Чистое решение состоит в том, чтобы иметь таблицу, в которой перечислены все «вещи» во вселенной, которую вы описываете:

person(martha).
person(charlotte).
% etc

И тогда ваши "лайки" будут скорее:

person_likes(P, pomegranate) :-
    person(P).

Вы также можете попробовать взломать его:

person(P) :- child(P, _).
person(P) :- child(_, P).

Но это... неудовлетворительно? Подумайте о реляционной базе данных: у вас будет две таблицы:

CREATE TABLE person (
  id INTEGER PRIMARY KEY, -- usually autogenerated
  name TEXT NOT NULL
);
CREATE TABLE parent_child (
  parent_id INTEGER NOT NULL,
  child_id INTEGER NOT NULL,
  FOREIGN KEY parent_id REFERENCES person(id),
  FOREIGN KEY child_id REFERENCES person(id)
);

Насколько мне известно, единственная причина, по которой вы не делаете то же самое на Прологе, заключается в том, что большинство вводных руководств пытаются соблазнить вас и не вдаваться в такие подробности. И, конечно же, «база данных» Prolog не является настоящей реляционной базой данных (например, позиция аргумента имеет значение!).

TL;DR Вы не можете не думать о стратегии разрешения Пролога при использовании Пролога.

person Community    schedule 23.04.2016