Форум программистов, компьютерный форум, киберфорум
Наши страницы
Prolog
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/10: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Psilon
Master of Orion
Эксперт .NET
6025 / 4877 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
1

Visual Prolog для чайников ч.2

18.02.2014, 20:53. Просмотров 1907. Ответов 12
Метки нет (Все метки)

Быстро назрели вопросы для второй части.

Первый заключается в том, как работать с предикатом NOT? Пробовал гуглить, но слово слишком общее, чтобы что-то нормальное найти.
http://wiki.visual-prolog.com/index....ence/Terms#Not
Тут нашел, но нету примеров по использованию. Интуитивное
Prolog
1
2
male(_).
female(X) :- NOT(male(X)).
посылает с тем, что у меня процедура не возвращает значение. Хотя я думал, что все прологовские клаузы неявно возвращают булевское значение и у меня что-то вроде такого (в терминах сишных лямбд):
C#
1
2
Predicate<string> male = x => true;
Predicate<string> female = x => !male(x);
Второе: почему-то в трубе (если верить методе) задаются факты в таком духе:
Prolog
1
male("Вася").
Но ViPу это не нравится, говорит ошибку:
The predicate 'main::male/1 (i)', which is declared as 'procedure', is actually 'determ'
судя по тому, что я нагуглил, это потому, что он возвращает значения не для всех X. Окей, пусть для васи это верно, а для других он фейлится, тогда:
Prolog
1
male(X) :- X == "Вася"; fail().
но он вместо того, чтобы просто вернуть "false" валит программу с исключением. А мне нужно просто написать, верен ли этот предикат для
Prolog
1
2
male("Вася"),
male("Петя").
please, advice
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2014, 20:53
Ответы с готовыми решениями:

Visual Prolog для чайников
Добрый день. Просьба не обращать внимание на кол-во сообщений: в прологе я дуб дубом. Пытаюсь...

Начало работы Prolog для чайников.
Всем доброго времени суток. Не подскажете что может быть? Создаю новый консольный проект в visual...

Перенос программы с Visual Prolog 7.1 в Visual Prolog 7.5
Проблема переноса. Взяла пример с книги Visual Prolog 7.1 для начинающих. Это игра червь. Вроде...

Адаптировать для visual prolog 7.5
Здравствуйте! Под конец магистратуры меня решили обременить прологом. Вроде нашел кучу полезных...

Пожалуйста, помоите переделать программу с Turbo Prolog на Visual Prolog
DOMAINS l_i=integer* l_s=string* i=integer s=string c=char structura=str(i,s) %Структура...

12
keidin
98 / 98 / 14
Регистрация: 07.02.2013
Сообщений: 128
19.02.2014, 01:10 2
Цитата Сообщение от Psilon Посмотреть сообщение
The predicate 'main::male/1 (i)', which is declared as 'procedure', is actually 'determ'
эта ошибка значит, что недетерминированный предикат вызывается из процедуры. В таком случае нужна дополнительная процедура, которая бы, образно говоря, "возвращала значение". В данном случае нужно организовать проход по фактам.(Факты в 7.4 описываются в class facts)
Будет как-то так:
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
implement main
    open core
 
constants
    className = "main".
    classVersion = "".
 
class facts
male:(string).
 
class predicates
female:(string).
 
clauses
    classInfo(className, classVersion).
    male("Вася").
    male("Петя").
    female(X):- not(male(X)),stdio::write("Ok"),fail().
    female(_).
 
clauses
 
    run():-
        console::init(),
        stdio::write("Name->"),
        X=stdio::readLine(),
        female(X),
        programControl::sleep(1000),
        succeed().
end implement main
 
goal
    mainExe::run(main::run).
1
Psilon
Master of Orion
Эксперт .NET
6025 / 4877 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.02.2014, 01:41  [ТС] 3
keidin, Спасибо, но все же, нельзя рекурсивно определить их через отрицание, то есть
male = !female.
female = !male.


Понимает ли он такие бесконечные рекурсии? В том смысле, чтобы если я напишу
Prolog
1
2
male("Вася").
female("Маша").
он бы вывел, что
Prolog
1
2
not(female("Вася")).
not(male("Маша")).
Если же не указан ни один из вариантов, то выход из бесконечной рекурсии производится с чем-нибудь вроде "извини, undefined".

И можно ли использовать один и тот же предикат как факт и как клауз. То есть например
Prolog
1
male(_) :- male("Вася").
он говорит "error c267 : The fact 'main::male/1' cannot have a clause body". Но ведь я могу иметь как факт, так и вывод. Например, если мы введем предикат father, и предикат parent, которые можем определить, как
Prolog
1
father(x,y) :- parent(x,y), male(x).
но я хочу например сказать, что Ваня - отец Пети, то я не могу просто написать
Prolog
1
father("Ваня", "Петя").
т.к. он хочет услышать либо клауз, либо факт. В принципе я конечно могу написать
Prolog
1
2
parent("Ваня", "Петя").
male("Ваня").
но это излишнее усложнение, да и работает это только на небольшой вложенности предикатов, да и сами предикаты простые.
0
keidin
98 / 98 / 14
Регистрация: 07.02.2013
Сообщений: 128
19.02.2014, 13:14 4
1. Использовать один и тот же предикат как правило и как факт. Да, так можно было делать в Турбо Прологе и, например, в VP 5.2. И факты и правила объявлялись в разделе predicates.
Prolog
1
2
3
 male("Ваня").
 male("Петя").
 male(X):-not(female(X)).
Для указанных версий этот код был бы рабочим.
В 7.4 (как и в более ранней 7.1) для определения факта выделен спец.раздел class facts, поэтому при компиляции в строке
Prolog
1
male(X):-not(female(X))
будет ошибка, сообщающая о том, что в разделе clauses у данного факта не может быть тела. Т.е. определили факт, вот и работайте с ним как со "статическим объектом" (это моя интерпретация).
2. Определить рекурсивно через отрицание male = !female. Так тоже не получится, покольку это приведет к ситуации "не процедура внутри процедуры". решить можно только за счет введения доп. процедуры (см. предыдущий пост).
3. Вы можете использовать факт вида
Prolog
1
father("Ваня", "Петя")
Но опять-таки, узнать, что Петя - это сын можно только с помощью процедуры, которая будет возвращать значение.
Prolog
1
father(x,y) :- parent(x,y), male(x)
- это определение отношения, суть которого: х - отец у, если х - родитель у и х - мужчина. Это также процедура, работающая с фактами.
2
Psilon
Master of Orion
Эксперт .NET
6025 / 4877 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.02.2014, 13:37  [ТС] 5
keidin, пытаюсь понять логику создателей языка, зачем изначально рабочую концепцию кастрировали. Просто чем дальше изучаю язык, тем лучше вижу, что ViP скорее ухудшение языка, а не улучшение. По большому счету в TP мне не нравится только сама эта дос-like среда. Печально, что все так плохо.
0
keidin
98 / 98 / 14
Регистрация: 07.02.2013
Сообщений: 128
19.02.2014, 14:03 6
Посмотрите книгу Visual Prolog для чайников. Автор Эдуардо Коста.
1
Psilon
Master of Orion
Эксперт .NET
6025 / 4877 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.02.2014, 14:07  [ТС] 7
keidin, да я её качнул пару дней назад, почитываю. Вопрос не в том как сделать, тьюринг-полный язык позволяет что угодно, вопрос, почему так через одно место сделали, когда раньше было нормально... В этом вопрос...

За помощь спасибо, понял, что без извратов сделать подобное сложно.
0
Винитархъ
Заблокирован
19.02.2014, 22:37 8
Цитата Сообщение от Psilon Посмотреть сообщение
...почему так через одно место сделали, когда раньше было нормально...
Psilon, Вы просто не курите VIP7 вообще.
0
Psilon
Master of Orion
Эксперт .NET
6025 / 4877 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
19.02.2014, 22:40  [ТС] 9
Винитархъ, без обид, но я со стороны вижу множество возможностей каждого языка, и не вижу ни одной причины, почему не оставить эту фичу такой, какой она была :dunno: Если же такая причина есть - пусть дадут ссылочку на описание, типа того, почему в каком-нибудь шарпе используется virtcall для вызова невиртуальных методов или почему Enumerator - мутабельная структура... Я считал это бредом, ознакомился, согласился, что правильно сделали. Есть ли подобное для данной ситуации? Я не нашел.
0
Винитархъ
Заблокирован
20.02.2014, 21:26 10
Цитата Сообщение от Psilon Посмотреть сообщение
не вижу ни одной причины, почему не оставить эту фичу такой, какой она была
Я не понимаю о какой фиче идёт речь, так как эта тема представляет собой нагромождение нелепостей. Всё, что работало в VIP5, работает и в VIP7, кроме ссылочных доменов (reference).
1
Psilon
Master of Orion
Эксперт .NET
6025 / 4877 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
20.02.2014, 21:53  [ТС] 11
Окей, вот конкретный вопрос: почему дважды печатается "X и Y - братья"? То есть я вижу корреляцию с числом отработки предиката "parent", но ПОЧЕМУ они связаны - хз.
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
implement main
    open core
 
class facts
    father:(string,string).
    mother:(string,string).
class predicates
    fatherBrother:(string,string) nondeterm anyflow.
    motherBrother:(string,string)  nondeterm anyflow.
    fatherSister:(string,string)  nondeterm anyflow.
    motherSister:(string,string)  nondeterm anyflow.
    brother:(string,string) nondeterm anyflow.
    sister:(string,string) nondeterm anyflow.
    parent:(string,string) nondeterm anyflow.
class facts
 
    male:(string) .
    female:(string) .
clauses
    parent(X,Y) :- father(X,Y); mother(X,Y).
    fatherBrother(X,Y) :- male(X), male(Y), father(Z,X), father(Z,Y).
    motherBrother(X,Y) :- male(X), male(Y), mother(Z,X), mother(Z,Y).
    fatherSister(X,Y) :- female(X), female(Y), father(Z,X), father(Z,Y).
    motherSister(X,Y) :- female(X), female(Y), mother(Z,X), mother(Z,Y).
 
    male("Мономах").
    male("Мстислав Великий").
    male("Изяслав").
    male("Святослав").
    male("Роман").
    male("Ярополк").
    male("Вячеслав").
    male("Юрий Долгорукий").
 
    sister(X,Y) :- parent(Z,X), parent(Z,Y), female(X).
    brother(X,Y) :- parent(Z,X), parent(Z,Y), male(X).
clauses
    father("Мономах","Мстислав Великий").
    father("Мономах","Изяслав").
    father("Мономах","Святослав").
    father("Мономах","Роман").
    father("Мономах","Ярополк").
    father("Мономах","Вячеслав").
    father("Мономах","Юрий Долгорукий").
 
    mother("Гите Уэссекская","Мстислав Великий").
    mother("Гите Уэссекская","Изяслав").
    mother("Гите Уэссекская","Святослав").
    mother("Гите Уэссекская","Роман").
    mother("Гите Уэссекская","Ярополк").
    mother("Гите Уэссекская","Вячеслав").
    mother("Гите Уэссекская","Юрий Долгорукий").
clauses
    run():-
        console::init(),
        stdio::write("Введите имя"), stdio::nl,
        X = "Роман", %stdio::readLine(),
        brother(X,"Святослав"),
        stdio::writef("% и % - братья", X, "Святослав"), stdio::nl,
        fail;
        not(brother(X,"Святослав")),
        stdio::write("Нет таких"), stdio::nl,
        fail;
        _ = stdio::readLine().
end implement main
 
goal
    mainExe::run(main::run).
0
keidin
98 / 98 / 14
Регистрация: 07.02.2013
Сообщений: 128
20.02.2014, 23:37 12
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

Сначала в parent задействованы факты отец, а после fail - факты мать. Вот Вам два одинаковых решения по папе и по маме. Можно использовать отсечение:
Prolog
1
 parent(X,Y) :- father(X,Y),!; mother(X,Y),!.
2
Psilon
Master of Orion
Эксперт .NET
6025 / 4877 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
21.02.2014, 09:55  [ТС] 13
keidin, любопытно, я думал он сначала проверяет условие, и если оно истина, то проверяет следующее условие. А так он как бы раскрыл скобки (a or b)*c. Неожиданное поведение .

Спасибо за конструктивную помощь
0
21.02.2014, 09:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2014, 09:55

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

Перевести код из turbo prolog в visual prolog
не подскажите плиз как будет выглядеть код turbo prolog в Visual Prologe 7.3 turbo prolog: ...

Код Turbo Prolog переделать в Visual Prolog 5.2
Помогите пожалуйста переделать код Turbo Prolog в Visual Prolog 5.2 domains...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru