Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
2 / 2 / 1
Регистрация: 03.11.2016
Сообщений: 40

Задача коммивояжёра на Visual Prolog 7.5

25.05.2019, 10:54. Показов 3966. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, необходимо решить задачу коммивояжёра для заданного графа средствами Visual Prolog 7.5.
Нашел вот такое решение, но необходимо переделать под 7.5:

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
DOMAINS  
s=string
sl=string*
i=integer
 
DATABASE - best 
best(i,sl)
CONSTANTS   
st=["Dnepr","somecity","somecity","somecity","somecity","somecity","somecity","Dnepr"]   
pass=["Kiev","Lugansk","Zaporoje","Doneck","Poltava","Kiev"] 
 
 
PREDICATES
go
setBest(i,sl)
nondeterm findWay(sl,sl,i,sl)
nondeterm setX(s,s,sl,sl)
delta(s,s,i)
checkLen(i)
nondeterm member(sl,s,sl)
put(s,i,s)
menu
command(integer)
  
CLAUSES
go:- findWay(st,_,Len,Way), setBest(Len,Way), fail.
go:- retract(best(Len,Way)), write("L=",Len,"  Way:",Way,"\n"),fail.
go.
 
findWay([X],pass,0,[X]):-!.
findWay([T|Ts], Pass , Len, [X,Y|W]):- findWay(Ts,P,L,[Y|W]), setX(T,X,P,Pass), 
                              delta(X,Y,Del), Len=L+Del, checkLen(Len).
 
setX(T,T,P,P):- not(T="somecity"),!.
setX(_,X,P,Pass):- member(P,X,Pass).
 
member([X|Y],X,Y).
member([X|Y],Z,[X|Q]):- member(Y,Z,Q).
 
delta(_,q,0):-!.
delta(X,Y,Del):- put(X,Del,Y),!.
delta(X,Y,Del):- put(Y,Del,X).
 
checkLen(Len):- best(Z,_),!, Len<=Z.
 
setBest(Len,Way):- best(L,_), L>Len, retractall(best(_,_)), assert(best(Len,Way)),!.
setBest(Len,Way):- best(Len,_), assert(best(Len,Way)),!.
 
best(50000,[]).
 
put("Kiev",607,"Zaporoje").
put("Kiev",533,"Dnepr").
put("Kiev",337,"Poltava").
put("Kiev",727,"Doneck").
put("Kiev",811,"Lugansk").
put("Dnepr",196,"Poltava").
put("Dnepr",252,"Doneck").
put("Dnepr",394,"Lugansk").
put("Dnepr",81,"Zaporoje").
put("Poltava",474,"Lugansk").
put("Poltava",390,"Doneck").
put("Poltava",270,"Zaporoje").
put("Doneck",217,"Zaporoje").
put("Doneck",148,"Lugansk").
put("Lugansk",365,"Zaporoje").
 
 
  command(1):-
    go, readchar(_), menu.
  command(2):-
    exit.
  menu:-
    write("\n    Menu\n\n"),
    write("1. View solution\n"),
    write("2. Exit\n"),
    write("\n Your choice: \n"),
    readint(Choice), command(Choice).
        
goal
  menu.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2019, 10:54
Ответы с готовыми решениями:

[Turbo Prolog] [Visual Prolog] Задача на рекурсию
Здравствуйте, помогите, пожалуйста, с такой задачей... Имеется горсть из N Монет C1,C2,....,Cn различного достоинства. Определить,...

задача Visual Prolog 7.3
Здравствуйте. Найдите пожалуйста ошибку в коде, почему то не запускается. пишет ошибку в mail( не могу понять в чем дело). (ввести нужно...

[Visual Prolog] Определить профессии девушек
Добрый вечер! Пожалуйста, помогите решить логическую задачку на Visual Prolog 5.2: &quot;За столиком в кафе познакомились три девушки:...

3
Фрилансер
 Аватар для Black Fregat
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
25.05.2019, 11:06
Так переделывайте: Перевод в Visual Prolog
0
2 / 2 / 1
Регистрация: 03.11.2016
Сообщений: 40
25.05.2019, 17:37  [ТС]
Ругается на menu: "The clauses of the predicate 'menu/0' are not grouped together"

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
% Copyright
 
implement main
    open core, console
 
constants
st=["Dnepr","somecity","somecity","somecity","somecity","somecity","somecity","Dnepr"].
pass=["Kiev","Lugansk","Zaporoje","Doneck","Poltava","Kiev"].
 
domains
    s=string.
    sl=string*.
    i=integer.
 
class facts
best:(i,sl).
 
class predicates
    go : ().
    setBest:(i,sl).
    findWay:(sl,sl,i,sl) nondeterm anyflow.
    setX:(s,s,sl,sl) nondeterm anyflow.
    delta:(s,s,i).
    checkLen:(i).
    member:(sl,s,sl) nondeterm anyflow.
    put:(s,i,s).
    menu : ().
    command:(integer).
 
clauses
    go():- findWay(st,_,Len,Way), setBest(Len,Way), fail.
go():- retract(best(Len,Way)), write("L=",Len,"  Way:",Way,"\n"),fail.
go().
 
findWay([X],pass,0,[X]):-!.
findWay([T|Ts], Pass , Len, [X,Y|W]):- findWay(Ts,P,L,[Y|W]), setX(T,X,P,Pass),
                              delta(X,Y,Del), Len=L+Del, checkLen(Len).
 
setX(T,T,P,P):- not(T="somecity"),!.
setX(_,X,P,Pass):- member(P,X,Pass).
 
member([X|Y],X,Y).
member([X|Y],Z,[X|Q]):- member(Y,Z,Q).
 
delta(_,_,0):-!.
delta(X,Y,Del):- put(X,Del,Y),!.
delta(X,Y,Del):- put(Y,Del,X).
 
checkLen(Len):- best(Z,_),!, Len<=Z.
 
setBest(Len,Way):- best(L,_), L>Len, retractall(best(_,_)), assert(best(Len,Way)),!.
setBest(Len,Way):- best(Len,_), assert(best(Len,Way)),!.
 
best(50000,[]).
 
put("Kiev",607,"Zaporoje").
put("Kiev",533,"Dnepr").
put("Kiev",337,"Poltava").
put("Kiev",727,"Doneck").
put("Kiev",811,"Lugansk").
put("Dnepr",196,"Poltava").
put("Dnepr",252,"Doneck").
put("Dnepr",394,"Lugansk").
put("Dnepr",81,"Zaporoje").
put("Poltava",474,"Lugansk").
put("Poltava",390,"Doneck").
put("Poltava",270,"Zaporoje").
put("Doneck",217,"Zaporoje").
put("Doneck",148,"Lugansk").
put("Lugansk",365,"Zaporoje").
 
  command(1):-
    go, console::readChar(_), menu.
  command(2):-
    exit.
 
menu() :-
    console::write("\n    Menu\n\n"),
    console::write("1. View solution\n"),
    console::write("2. Exit\n"),
    console::write("\n Your choice: \n"),
    readint(Choice), command(Choice).
    fail().
    menu().
 
end implement main
 
goal
    console::run(main::menu).
Добавлено через 5 часов 40 минут
Выдает вот такую ошибку: e631 The predicate 'main::run/0', which is declared as 'procedure', is actually 'determ' в 87 строчке.


Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
% Copyright
 
implement main
    open core, console
 
domains
    s=string.
    sl=string*.
    i=integer.
    list = ::string*.
 
    constants
st : list =["Dnepr","somecity","somecity","somecity","somecity","somecity","somecity","Dnepr"].
pass : list =["Kiev","Lugansk","Zaporoje","Doneck","Poltava","Kiev"].
 
class facts
best:(i,sl).
class predicates
    go : ().
    setBest:(i,sl) nondeterm anyflow.
    findWay:(sl,sl,i,sl) nondeterm anyflow.
    setX:(s,s,sl,sl) nondeterm anyflow.
    delta:(s,s,i) nondeterm anyflow.
    checkLen:(i) nondeterm anyflow.
    member:(sl,s,sl) nondeterm anyflow.
    put:(s,i,s) nondeterm anyflow.
    command:(integer) determ(i).
    readint:(integer) procedure(o).
clauses
    readint(_) :-
        exception::raise_error("Not implemented").
 
clauses
    go():- findWay(st,_,Len,Way), setBest(Len,Way), fail.
go():- retract(best(Len,Way)), write("L=",Len,"  Way:",Way,"\n"),fail.
go().
 
findWay([X],pass,0,[X]):-!.
findWay([T|Ts], Pass , Len, [X,Y|W]):- findWay(Ts,P,L,[Y|W]), setX(T,X,P,Pass),
                              delta(X,Y,Del), Len=L+Del, checkLen(Len).
 
setX(T,T,P,P):- not(T="somecity"),!.
setX(_,X,P,Pass):- member(P,X,Pass).
 
member([X|Y],X,Y).
member([X|Y],Z,[X|Q]):- member(Y,Z,Q).
 
delta(_,_,0):-!.
delta(X,Y,Del):- put(X,Del,Y),!.
delta(X,Y,Del):- put(Y,Del,X).
 
checkLen(Len):- best(Z,_),!, Len<=Z.
 
setBest(Len,Way):- best(L,_), L>Len, retractall(best(_,_)), assert(best(Len,Way)),!.
setBest(Len,Way):- best(Len,_), assert(best(Len,Way)),!.
 
best(50000,[]).
 
put("Kiev",607,"Zaporoje").
put("Kiev",533,"Dnepr").
put("Kiev",337,"Poltava").
put("Kiev",727,"Doneck").
put("Kiev",811,"Lugansk").
put("Dnepr",196,"Poltava").
put("Dnepr",252,"Doneck").
put("Dnepr",394,"Lugansk").
put("Dnepr",81,"Zaporoje").
put("Poltava",474,"Lugansk").
put("Poltava",390,"Doneck").
put("Poltava",270,"Zaporoje").
put("Doneck",217,"Zaporoje").
put("Doneck",148,"Lugansk").
put("Lugansk",365,"Zaporoje").
 
clauses
  command(1):-
    go, _ = readChar(), run.
  command(2):-
    fail.
 
clauses
    run():-
    write("\n    Menu\n\n"),
    write("1. View solution\n"),
    write("2. Exit\n"),
    write("\n Your choice: \n"),
    readint(Choice), command(Choice),
     _ = console::readLine().
 
end implement main
 
goal
    console::run(main::run).
0
Фрилансер
 Аватар для Black Fregat
3709 / 2082 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
25.05.2019, 19:17
Цитата Сообщение от Korbann Посмотреть сообщение
e631 The predicate 'main::run/0', which is declared as 'procedure', is actually 'determ'
Надо замкнуть run до процедуры. Тут есть пример: Режимы детерминизма предикатов в Visual Prolog
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2019, 19:17
Помогаю со студенческими работами здесь

Visual prolog. Логическая задача
Новое дело Сэма Силли и Джонни Вуду. Не успели обитатели городка Пиэри Поуч прийти в себя после покушения на мисс Вамп, которое...

[Visual Prolog] Определить, кто разбил окно
Доброе время суток, с Прологом мало знаком, не могу решить задачу... Вот условие: Восемь школьников, оставшихся в классе на...

Логическая задача Visual Prolog
Добрый день помогите написать пожайлуста программу: а) база данных: Тони, Майкл и Джон – члены альпинклуба . Каждый член альпинклуба...

Visual Prolog. Задача про списки
Имеется список. Нужно удалить только 5-ый элемент этого списка, остальные оставить без изменения!

Логическая задача про котят Visual Prolog 9
Имеется четыре котенка – Дружок, Елисей, Фантик и Мурлыка и четыре мальчика – Миша, Максим, Леня и Дима. Каждый мальчик взял себе котенка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru