2017-01-09 8 views
0

У меня есть эта часть кода как базовый регистр в рекурсивном предикате.Почему пролог не распознает аргументы в запросе?

riduci_lista_valori([[V, N]],m_var,Lr):- 
    member(V, m_var), 
    Lr =[N]. 

Проблема заключается в том, что, когда я выполняю мой запрос не унифицировать правильно аргументы предиката с его параметрами.

Учитывая код, мой запрос: riduci_lista_valori([[a, 5]], [c,e], F). И я ожидаю, что Prolog вернется F = [5]. Отладка кода кажется, что он не признает должным образом аргументы, потому что он не объединяется: V = a, N = 5m_var = [c,e], но он дает: 1 = [[a, 5]] и 2 = [c, e].

В то время как, если я подскажу: [[V, N]] = [[a,5]]. это правильное объединение: V = a, N = 5.

Что я делаю неправильно? Спасибо!

ответ

4

Для выявления причины отказа в Прологе, используйте декларативной отладки:

Добавить следующие определения в программе:

:- op(920,fy, *). 
*_. 

Теперь вы можете использовать (*)/1 для обобщать подальше конкретные цели ,

Например:

 
riduci_lista_valori([[V, N]], m_var, Lr) :- 
     *member(V, m_var), 
     *Lr =[N]. 

Даже при этом гораздо более общей версии, мы получаем:

 
?- riduci_lista_valori([[a, 5]], [c,e], F). 
false. 

Это означает, что если вы ожидаете, что запрос к успеха на всех, вы необходимо далее обобщать вашу программу. Посмотрите, что на самом деле остается программы:

 
riduci_lista_valori([[V, N]], m_var, Lr) :- true. 

Этот фрагмент кода уже слишком специфической. Обобщим это так:

 
riduci_lista_valori([[V, N]], Var, Lr) :- true. 

Теперь запрос успешно:

 
?- riduci_lista_valori([[a, 5]], [c,e], F). 
true. 

Таким образом, этот второй аргумент вашей головы п является хорошим кандидатом для тщательной проверки!

Возможно, вы имели в виду использовать переменную вместо атомаm_var?

+0

Спасибо за ваш ответ, я узнал что-то новое о декларативной debbugging. Но ваша последняя линия спасла мою ночь :) –

+0

s (X), какая потрясающая идея! –

+1

Не могли бы вы включить ссылку, которая объясняет \ расширяет 'декларативную отладку' в отношении Prolog; особенно использование op (920, fy, *). Это хорошая техника, которую я хотел бы включить в свою панель инструментов Prolog. Если вы хотите, чтобы это как отдельный вопрос, просто спросите. Возможно, это должен быть тег со ссылками, например [tag: failure-slice] –

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

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