Перевести программу на SWI Prolog
Формулировка задачи:
добрый вечер, помогите перевести программу на SWI - Prolog
я понимаю что в swi не нужно обьявление domains так что вот начал переделку
Листинг программы
- domains
- IntList = Integer*
- facts - граф
- связь(Integer,Integer,Real)
- predicates
- nondeterm цикл(Integer,Integer,IntList,IntList,Real,Real)
- принадлеж(Integer,IntList,Integer)
- nondeterm другой_больше(Real)
- goal
- связь(Вершина,_,_),
- цикл(Вершина,Вершина,[Вершина],Цикл,0.0,Длина),
- not(другой_больше(Длина)).
- clauses
- цикл(Конец,Конец,Цикл,Цикл,Длина,Длина).
- цикл(Начало,Конец,Цикл0,Цикл,Длина0,Длина):-
- связь(Начало,Промежут,Длина1),
- not(принадлеж(Промежут,Цикл0,Конец)),
- Длина2 = Длина0 + Длина1,
- цикл(Промежут,Конец,[Промежут|Цикл0],Цикл,Длина2,Длина).
- другой_больше(Длина):-
- связь(Вершина,_,_),
- цикл(Вершина,Вершина,[Вершина],_,0.0,Длина1),Длина1>Длина.
- принадлеж(Вершина,_,Вершина):-!,fail.
- принадлеж(Вершина,[Вершина|_],_):-!.
- принадлеж(Вершина,[_|Цикл],Конец):-принадлеж(Вершина,Цикл,Конец).
- связь(1,2,2.7). связь(1,4,4.3). связь(2,3,5.6). связь(3,4,6.8).
- связь(4,5,16.3). связь(5,6,10.9). связь(6,1,1.0). связь(2,9,23.2).
- связь(9,8,1.4). связь(8,7,10.1). связь(7,6,1.9). связь(7,5,10.4).
Листинг программы
- goal:-связь(Вершина,_,_),цикл(Вершина,Вершина,[Вершина],Цикл,0.0,Длина),not(другой_больше(Длина)).
- цикл(Конец,Конец,Цикл,Цикл,Длина,Длина).
- цикл(Начало,Конец,Цикл0,Цикл,Длина0,Длина):-связь(Начало,Промежут,Длина1),
- not(принадлеж(Промежут,Цикл0,Конец)),
- Длина2 is Длина0 + Длина1,
- цикл(Промежут,Конец,[Промежут|Цикл0],Цикл,Длина2,Длина).
- другой_больше(Длина):-связь(Вершина,_,_),цикл(Вершина,Вершина,[Вершина],_,0.0,Длина1),Длина1>Длина.
- принадлеж(Вершина,_,Вершина):-!,fail.
- принадлеж(Вершина,[Вершина|_],_):-!.
- принадлеж(Вершина,[_|Цикл],Конец):-принадлеж(Вершина,Цикл,Конец).
- связь(1,2,2.7). связь(1,4,4.3). связь(2,3,5.6). связь(3,4,6.8).
- связь(4,5,16.3). связь(5,6,10.9). связь(6,1,1.0). связь(2,9,23.2).
- связь(9,8,1.4). связь(8,7,10.1). связь(7,6,1.9). связь(7,5,10.4).
Решение задачи: «Перевести программу на SWI Prolog»
textual
Листинг программы
- цикл(Конец,Конец,Цикл,Цикл,Длина).
- цикл(Начало,Конец,Цикл0,Цикл,Длина):-связь(Начало,Промежут),
- not(принадлеж(Промежут,Цикл0,Конец)),
- цикл(Промежут,Конец,[Промежут|Цикл0],Цикл,Длина).
- другой_больше(Длина):-связь(Вершина,_),цикл(Вершина,Вершина,[Вершина],_,Длина1),Длина1>Длина.
- принадлеж(Вершина,_,Вершина):-!,fail.
- принадлеж(Вершина,[Вершина|_],_):-!.
- принадлеж(Вершина,[_|Цикл],Конец):-принадлеж(Вершина,Цикл,Конец).
Объяснение кода листинга программы
В этом коде есть четыре правила:
- Цикл(Конец,Конец,Цикл,Цикл,Длина) - это базовый случай для цикла, когда начальное и конечное значения совпадают, и у цикла нет разделения.
- Цикл(Начало,Конец,Цикл0,Цикл,Длина) - это рекурсивный случай для цикла, когда начальное и конечное значения не совпадают, и есть промежуточное значение, которое не принадлежит циклу.
- Другой_больше(Длина) - это правило, которое проверяет, есть ли другой цикл, который больше текущего.
- Принадлеж(Вершина,_,Вершина) - это правило, которое говорит, что вершина принадлежит циклу, если она является начальной вершиной и конечной вершиной.
- Принадлеж(Вершина,[Вершина|],)- это правило, которое говорит, что вершина принадлежит циклу, если она является начальной вершиной и последним элементом.
- Принадлеж(Вершина,[_|Цикл],Конец)- это правило, которое рекурсивно проверяет, принадлежит ли вершина циклу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д