Nano Hash - криптовалюты, майнинг, программирование

Сопоставление с шаблоном: запрос возвращает «нет», даже если указан базовый случай

У меня есть простая программа на Прологе, в отладке которой мне нужна помощь. Суть в том, чтобы расширить программу путем сопоставления с образцом, чтобы создать средство проверки доказательств для логики высказываний. Моя проблема заключается в том, что я получаю «нет», когда я ожидаю «да», и мое «исправление» (предоставляющее базовый случай для valid_proof_aux) по-прежнему дает мне два решения, и я не знаю, почему.

Пока не знаю, как заняться отладкой Prolog, извините.

%call:
valid_proof([p],p,[[1, p, premise]])

%src:

reverse_it([],Z,Z).

reverse_it([H|T],Z,Acc) :- reverse_it(T,Z,[H|Acc]).


valid_proof(Prems,Goal,Proof):-
    last(Proof, [_, Goal, _]),
    reverse_it(Proof, RevP, []),
    valid_proof_aux(Prems, RevP) .

valid_proof_aux(Prems,
        [[_,Prop,premise] | T]):-
    memberchk(Prop,Prems),
    valid_proof_aux(Prems,T).

%my 'fix'
valid_proof_aux(_, []) :- true .

  • Действительно ли ваша программа, как вы ее показали, компилируется без каких-либо предупреждений или ошибок? Если это не так, какие предупреждения или ошибки вы видите? (Вы никогда не должны игнорировать предупреждения, они почти всегда показывают, что у вас есть реальная проблема с вашим кодом). 11.09.2015

Ответы:


1

Вы на самом деле не показываете, как запускать программу и что именно вы получаете (вы должны отредактировать свой вопрос и добавить это), поэтому этот ответ немного догадывается, но в любом случае:

В любом случае вам нужен базовый случай (как вы сами наблюдаете), valid_proof_aux/2 потерпит неудачу, когда список станет пустым [] и больше не будет соответствовать [[...]|T].

?- [] = [_|_]. % try to unify an empty list with a non-empty list
false.

Что вам нужно сделать, чтобы избавиться от точки выбора, так это поместить аргумент списка в качестве первого аргумента.

valid_proof_aux([], _).
valid_proof_aux([[_,Prop,premise]|T], Prems) :-
    memberchk(Prop, Prems),
    valid_proof_aux(T, Prems).

Обратите внимание, что вам не нужен :- true., это неявно. Кроме того, не оставляйте пробелов с двух сторон | в [Head|Tail].

11.09.2015
  • Вы забыли переключиться на valid_proof_aux(T,Prems) :)! 11.09.2015
  • @ejbs Сначала я действительно так делал, но теперь я вижу это правильно? 11.09.2015
  • Один вопрос: почему Пролог дает мне «истину»? подсказка, когда я запускаю свою программу? 11.09.2015
  • @ejbs Какую реализацию вы используете? И вы действительно должны включить точное содержание вашего взаимодействия с интерпретатором Пролога в свой вопрос, чтобы другим было легче узнать, с чем вы на самом деле имеете дело. 11.09.2015
  • Извините, Борис, я использую gprolog. См. оригинал В. Я нажимаю ввод, когда меня спрашивают «true?» 11.09.2015
  • Да, это так. Хм, подсказка исчезла при перекомпиляции. Спасибо. 11.09.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..