Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 22.05.2014
Сообщений: 31
1

"Миссионеры и людоеды", prolog 5.2

22.05.2014, 21:33. Показов 2112. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые профессионалы,помогите пожалуйста исправить ошибку в коде,что-то у меня не получается.
В общем условие задачи:Есть 5 миссионеров и пять людоедов и трёхместная лодка,нужно переправить всех на другой берег,но чтобы людоедов всегда было меньше или равно числу миссионеров на любом из берегов и в лодке тоже,иначе они съедят миссионеров.

Как я понял ошибка в zero,но я никак не пойму как её исправить.

Спасибо.

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
database
    entry(symbol,integer,integer,integer,integer)
    
domains
    Left_miss,Left_cann,Right_miss,Right_cann=integer
    Total_miss,Total_cann=integer
    New_left_miss,New_left_cann,New_right_miss,New_right_cann=integer
    person1,person2=integer
    
predicates
    boat_state(integer,integer)
    zero(integer,integer)
    go(symbol,integer,integer,integer,integer)
    validate(integer,integer,integer,integer)
    
clauses
    boat_state(0,3).     
    boat_state(0,1).
    boat_state(0,2).
    boat_state(3,0).
    boat_state(1,1).
    boat_state(2,1).    
    boat_state(1,0).
    boat_state(2,0).
 
        zero(X,Y):-
        X=0,Y<>0.
 
    validate(Left_miss,Left_cann,Right_miss,Right_cann):-
        Total_miss=Left_miss+Right_miss,
        Total_cann=Left_cann+Right_cann,
        Total_miss=5,Total_cann=5,
        Left_miss>=0,Left_cann>=0,
        Right_miss>=0,Right_cann>=0,
        Left_miss>=Left_cann,Right_miss>=Right_cann.
 
    validate(Left_miss,Left_cann,Right_miss,Right_cann):-
        Total_miss=Left_miss+Right_miss,
        Total_cann=Left_cann+Right_cann,
        Total_miss=5,Total_cann=5,
        Left_miss>=0,Left_cann>=0,
        Right_miss>=0,Right_cann>=0,
        zero(Left_miss,Left_cann);
 
        Total_miss=Left_miss+Right_miss,
        Total_cann=Left_cann+Right_cann,
        Total_miss=5,Total_cann=5,
        Left_miss>=0,Left_cann>=0,
        Right_miss>=0,Right_cann>=0,
        zero(Right_miss,Right_cann).
 
    go(_,0,0,5,5):-
        write("Problem Solved"),nl.
 
    go(left_to_right,Left_miss,Left_cann,Right_miss,Right_cann):-
        boat_state(Person1,Person2),
        New_left_miss=Left_miss-Person1,
        New_left_cann=Left_cann-Person2,
        New_right_miss=Right_miss+Person1,
        New_right_cann=Right_cann+Person2,
        not(entry(right_to_left,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        validate(New_left_miss,New_left_cann,New_right_miss,New_right_cann),
        assert(entry(right_to_left,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        write("Left to right \t",New_left_miss," ",New_left_cann," \t",Person1," ",Person2," \t",New_right_miss," ",New_right_cann),nl,
        go(right_to_left,New_left_miss,New_left_cann,New_right_miss,New_right_cann).
        
    go(right_to_left,Left_miss,Left_cann,Right_miss,Right_cann):-
        boat_state(Person1,Person2),
        New_left_miss=Left_miss+Person1,
        New_left_cann=Left_cann+Person2,
        New_right_miss=Right_miss-Person1,
        New_right_cann=Right_cann-Person2,
        not(entry(left_to_right,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        validate(New_left_miss,New_left_cann,New_right_miss,New_right_cann),
        assert(entry(left_to_right,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        write("Right to left \t",New_left_miss," ",New_left_cann," \t",Person1," ",Person2," \t",New_right_miss," ",New_right_cann),nl,nl,
        go(left_to_right,New_left_miss,New_left_cann,New_right_miss,New_right_cann).
goal
    write("Initial State  \t",5," ",5," \t",0," ",0," \t",0," ",0," "),nl,nl,
    assert(entry(left_to_right,5,5,0,0)),
    go(left_to_right,5,5,0,0).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2014, 21:33
Ответы с готовыми решениями:

Поиск в ширину (миссионеры и людоеды) на SWI-Prolog
Помогите новичку разобраться в логической задаче. Условие Миссионеры и людоеды (поиск в ширину)....

Миссионеры и людоеды
Помогите разобраться в логической задаче. Условие. Миссионеры и людоеды. Три миссионера и три...

Миссионеры и людоеды.Кое-что не понимаю
У меня есть код - решение задачи про 3 миссионеров и 3 людоедов. Но я не совсем понимаю, по какому...

Ах какое наслаждение! Еврейские людоеды и палестинские людоеды попритихли
Ах какое наслаждение! Еврейские людоеды и палестинские людоеды попритихли

2
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
23.05.2014, 08:48 2
Я, честно говоря, не понял, для чего был введен предикат zero. Без него программа работает.
Единственная проблема - он выдает не решение, а весь процесс поиска решения, со всеми неудачными попытками.
Обычно это лечится передачей в предикат go дополнительного параметра, в котором накапливается текущий путь.
И тогда печать делается в конце, когда путь уже найден
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
database
    entry(symbol,integer,integer,integer,integer)
    
predicates
    nondeterm boat_state(integer,integer) 
    nondeterm go(symbol,integer,integer,integer,integer) 
    nondeterm  validate(integer,integer,integer,integer) 
    
clauses
    boat_state(0,3).     
    boat_state(0,1).
    boat_state(0,2).
    boat_state(3,0).
    boat_state(1,1).
    boat_state(2,1).    
    boat_state(1,0).
    boat_state(2,0).
 
    validate(Left_miss,Left_cann,Right_miss,Right_cann):-
        Total_miss=Left_miss+Right_miss,
        Total_cann=Left_cann+Right_cann,
        Total_miss=5,Total_cann=5,
        Left_miss>=0,Left_cann>=0,
        Right_miss>=0,Right_cann>=0,
        Left_miss>=Left_cann,Right_miss>=Right_cann.
 
    validate(Left_miss,Left_cann,Right_miss,Right_cann):-
        Total_miss=Left_miss+Right_miss,
        Total_cann=Left_cann+Right_cann,
        Total_miss=5,Total_cann=5,
        Left_miss>=0,Left_cann>=0,
        Right_miss>=0,Right_cann>=0.
 
    go(_,0,0,5,5):-
        write("Problem Solved"),nl.
 
    go(left_to_right,Left_miss,Left_cann,Right_miss,Right_cann):-
        boat_state(Person1,Person2),
        New_left_miss=Left_miss-Person1,
        New_left_cann=Left_cann-Person2,
        New_right_miss=Right_miss+Person1,
        New_right_cann=Right_cann+Person2,
        not(entry(right_to_left,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        validate(New_left_miss,New_left_cann,New_right_miss,New_right_cann),
        assert(entry(right_to_left,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        write("Left to right \t",New_left_miss," ",New_left_cann," \t",Person1," ",Person2," \t",New_right_miss," ",New_right_cann),nl,
        go(right_to_left,New_left_miss,New_left_cann,New_right_miss,New_right_cann).
        
    go(right_to_left,Left_miss,Left_cann,Right_miss,Right_cann):-
        boat_state(Person1,Person2),
        New_left_miss=Left_miss+Person1,
        New_left_cann=Left_cann+Person2,
        New_right_miss=Right_miss-Person1,
        New_right_cann=Right_cann-Person2,
        not(entry(left_to_right,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        validate(New_left_miss,New_left_cann,New_right_miss,New_right_cann),
        assert(entry(left_to_right,New_left_miss,New_left_cann,New_right_miss,New_right_cann)),
        write("Right to left \t",New_left_miss," ",New_left_cann," \t",Person1," ",Person2," \t",New_right_miss," ",New_right_cann),nl,nl,
        go(left_to_right,New_left_miss,New_left_cann,New_right_miss,New_right_cann).
goal
    write("Initial State  \t",5," ",5," \t",0," ",0," \t",0," ",0," "),nl,nl,
    assert(entry(left_to_right,5,5,0,0)),
    go(left_to_right,5,5,0,0).
0
1 / 1 / 0
Регистрация: 22.05.2014
Сообщений: 31
23.05.2014, 14:50  [ТС] 3
Black Fregat, Спасибо большое
0
23.05.2014, 14:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2014, 14:50
Помогаю со студенческими работами здесь

Миссионеры и каннибалы
Три миссионера и три каннибала находятся на левом берегу реки.Здесь же-небольшая лодка,вмещающая не...

Какое из трех племен людоеды могут съесть?
Помогите перевести программу Pascal msgbox на PascalABC.NET Sub test() Dim x As Integer, y...

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

Кто обитает на форуме: миссионеры или волонтеры
прив! кто мы все здесь активные пользователи на форуме: миссионеры или волонтеры? да и вообще,...

Логическая задача. Миссионеры и каннибалы. Планирование действий в пространстве состояний
На берегу 3 миссионера и 3 каннибала. Лодка вмещает только двоих. Необходимо перевезти всех на...

Помогите найти реализ. головоломки "миссионеры и каннибаллы"
Помогите найти реализ. головоломки &quot;миссионеры и каннибаллы&quot; на Delphi. Очень нужно.

Из Turbo Prolog в Visual Prolog - где будут отличия в коде?
ребята ,помогите. есть прога на турбо прологе,а нужно отредактировать под visual prolog 7.5. Что...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru