2017-01-12 5 views
0

мне нужен предикат elements(X,L), где X представляет собой действие, как neg X, X and Y и возвращает список L со всеми элементами из эксплуатации, как [X,Y].Пролог - Возьмите рабочие элементы

У меня уже есть эти:

elements(neg X, [X]). 
elements(X and Y, [X,Y]). 
elements(X or Y, [X,Y]). 
elements(X imp Y, [X,Y]). 

Но я не знаю, как заставить его работать со сложными операциями, как X imp (Y or Z).

+2

Если это домашняя работа, пожалуйста, прочитайте [Как я могу задать и ответить на домашние вопросы?] (Http://meta.stackoverflow.com/q/334822/1243762) –

+1

Вы также должны представить пример кода, который вы написали, и объясните, где ваша проблема связана с вашим кодом. –

+0

@Guy Coder Да, это домашнее задание, но я все еще начинаю, и я понятия не имел, что еще я могу сделать. В любом случае, спасибо за ваши советы, и я посмотрю, смогу ли я заставить его работать. –

ответ

2

Я не силен в выборе старшинство оператора, но вот то, что у меня есть для ввода:

:- op(100, fx, neg). 
:- op(200, xfy, and). 
:- op(200, xfy, or). 
:- op(300, xfy, imp). 

elements(Term, Variables) :- term_variables(Term, Variables). 

Это, кажется, сделать то, что вы указали:

?- elements(X imp (Y and Z), Q). 
Q = [X, Y, Z]. 

Есть еще к вашей проблеме чем это?

+0

У меня противоположная проблема, я плохо разбираюсь в Prolog op. Ваш приоритет выглядит правильно: см. [Порядок приоритета] (https://en.wikipedia.org/wiki/Logical_connective#Order_of_precedence) –

+0

Благодарим вас и @GuyCoder за вашу помощь. Это именно то, что мне нужно. Я действительно занимался некоторыми исследованиями, но я не нашел этого предиката. –

+0

@MiguelAndrade Не беспокойтесь о том, чтобы не найти его, я должен был сначала его найти. Я был повесил трубку, написав парсер, когда был легче ответить. Кроме того, вы можете также предоставить вознаграждение в дополнение к принятому голосованию. –

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