Найти вещества с одинаковым удельным весом но разной группой проводимости. Visual Prolog 5.2

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть такая вот задача: Дан набор фактов со сведениями о вещества. Для каждого вещества указано: название вещества, его удельный вес и проводимость (проводник, полупроводник, изолятор). Определить есть ли вещества с одинаковыми удельными весами в разных группах. Определить количество таких веществ. Написал я вот такое решение для Visual Prolog 5.2:
Вот с текущим набором фактов должно получится в ответе цифра 5. Программа выдает 6. В чем может быть ошибка? Вроде перебираю правильно, после сравнения удаляю ретрактом. Но почему-то выскакивает один лишний в этом случае. Кто-то может подсобить советом или кодом? Спасибо.

Решение задачи: «Найти вещества с одинаковым удельным весом но разной группой проводимости. Visual Prolog 5.2»

textual
Листинг программы
global Facts
single count(integer)
nondeterm thing(string, real, string)
nondeterm uniq(real, string)
 
Predicates
mark(real, string)
do()
Goal
do().
Clauses
thing("N1", 1.0, "Проводник").
thing("N2", 1.0, "Полупроводник").
thing("N3", 1.0, "Изолятор").
thing("N4", 1.0, "Проводник").
thing("N5", 2.1, "Полупроводник").
thing("N6", 2.1, "Изолятор").
thing("N7", 3.0, "Проводник").
count(0).
mark(P,G) :- retractall(uniq(P,G)), assert(uniq(P,G)).
do():- thing(NA1, P1, G1), thing(NA2, P2, G2), P1=P2, G1<>G2, NA1 <> NA2, mark(P1, G1), mark(P2, G2), fail.
do():- uniq(_, _), count(N), N1 = N + 1, assert(count(N1)), fail.
do():- count(N), write(N).

Объяснение кода листинга программы

  1. Создаются три глобальные переменные: Facts, count и uniq.
  2. Определяются три предиката: mark, thing и do.
  3. Создаются три утверждения: thing(N1, 1.0, Проводник), thing(N2, 1.0, Полупроводник), thing(N3, 1.0, Изолятор).
  4. Инициализируется переменная count(0).
  5. Определяется действие mark(P,G) :- retractall(uniq(P,G)), assert(uniq(P,G)).
  6. Определяется действие do():- thing(NA1, P1, G1), thing(NA2, P2, G2), P1=P2, G1<>G2, NA1 <> NA2, mark(P1, G1), mark(P2, G2), fail.
  7. Определяется действие do():- uniq(, ), count(N), N1 = N + 1, assert(count(N1)), fail.
  8. Определяется действие do():- count(N), write(N).
  9. Код выполняет следующие шаги: 1) Находит все утверждения с одинаковым удельным весом и разной группой проводимости. 2) Ретракты (удаляет) все утверждения с этими значениями. 3) Вставляет (ассистирует) новое утверждение с этими значениями. 4) Если найдены новые утверждения, повторяет шаги 1-3. 5) Если не найдены новые утверждения, увеличивает счетчик на 1 и вставляет новое утверждение. 6) Выводит значение счетчика.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы