2010-08-16 2 views
4

Итак, допустим, у меня есть следующий в базе данных Пролога:Обратный поиск в Прологе? (Как я нахожу все, что верно в отношении X?)

person(john). 
person(mary). 
happy(john). 

ясно, что если я хочу, чтобы перечислить все человек, я могу тип:

person(X). 

Но, если я хочу найти все, что касается Джона? Я не могу сделать:

X(john). 

Но эффект, который я хотел бы, чтобы быть в состоянии поставить в «Джон» и получить обратно «человек» и «счастливый».

Существует явно другой способ, которым я мог бы хранить свою информацию:

is(person, john). 
is(person, mary). 
is(happy, john). 

И потом, я могу сделать:

is(X, john). 

Но я теряю некоторую выразительность здесь. Я действительно хотел бы иметь возможность сделать что-то вроде:

X(john). 

Любые идеи?

Спасибо!

ответ

2

Параметрирование запрос по предикатам (как в поиске и FORALL; x над x(...)) не всегда возможно изначально в PROLOG, поскольку такого рода вещи является second- (or, higher)-order logic операции, в то время как PROLOG основан на логике первого порядка.

Есть, однако, описания того, как возможны реализации логических функций более высокого порядка в PROLOG, по крайней мере в ограниченной степени - существуют реальные возможности использования такой функциональности. См. The Art Of Prolog, Chapter 16 и Higher-order logic programming in Prolog by Lee Naish.

1

Хм, по моему опыту, это не типичный вариант использования Пролога. Если вы хотите перечислить все «факты» о Джоне, вам сначала нужно определить их как термины и закодировать их сущность. Затем вы можете использовать call/N и идти вниз по кроличьей норе еще на одну отметку (из памяти с помощью GNU Prolog):

relation(1,person). 
relation(2,married). 
person(john). 
married(john,mary). 

? relation(1,X), call(X,john). 

X = person 

| ?- relation(2,X),call(X,john,Y). 

X = married 
Y = mary 

Обратите внимание, что использование call имеет много интересных вопросов, и потенциал для ошибок во время выполнения.

+2

Интересно. Благодарю. Я полностью понимаю, что это не типичный прецедент для Пролога, но наверняка должен быть какой-то способ сделать то, что я прошу, верно? Это очень важная часть информации, которая закодирована в базе данных, должен быть способ ее запроса - «Что такое X?» – MikeC8

+0

Как мог Prolog, возможно, ответить на этот вопрос, даже синтаксически? Нет никакого способа, чтобы Пролог мог разумно собрать информацию от X (john) и жениться (john, ..). Даже из вашей базы данных, например, вы можете почувствовать, что факты было бы по строкам истинного (женатого (john, mary)) и истинного (person (john)), почти идентичного кодирования тому, которое я дал. Возможно, с какой-то другой нестандартной функцией вы могли бы спросить:? true (X), содержит John (X), рекурсивно анализируя X. Но я не знаю, как построить этот «содержащий». Тогда действительно может быть синтаксический ответ, подобный «X = замуж (john, mary)». – ShiDoiSi

0

Это приближение:

all_predicates(Term) :- 
    current_predicate(_, Pred), %% match Pred to any currently defined predicate 
    \+ predicate_property(Pred, built_in), %% filter out the built-in predicates 
    functor(Pred, Name, 1), %% check that Pred has 1 argument and match Name to its name 
    Goal =.. [Name, Term], %% construct the goal Name(Term) 
    call(Goal). %% Note that if Pred has side effects, they will happen. 

 Смежные вопросы

  • Нет связанных вопросов^_^