Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5

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

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

Студворк — интернет-сервис помощи студентам
Быстро назрели вопросы для второй части.

Первый заключается в том, как работать с предикатом NOT? Пробовал гуглить, но слово слишком общее, чтобы что-то нормальное найти.
http://wiki.visual-prolog.com/... /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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2014, 20:53
Ответы с готовыми решениями:

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

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

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

12
99 / 99 / 14
Регистрация: 07.02.2013
Сообщений: 128
19.02.2014, 01:10
Цитата Сообщение от 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
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.02.2014, 01:41  [ТС]
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
99 / 99 / 14
Регистрация: 07.02.2013
Сообщений: 128
19.02.2014, 13:14
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
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.02.2014, 13:37  [ТС]
keidin, пытаюсь понять логику создателей языка, зачем изначально рабочую концепцию кастрировали. Просто чем дальше изучаю язык, тем лучше вижу, что ViP скорее ухудшение языка, а не улучшение. По большому счету в TP мне не нравится только сама эта дос-like среда. Печально, что все так плохо.
0
99 / 99 / 14
Регистрация: 07.02.2013
Сообщений: 128
19.02.2014, 14:03
Посмотрите книгу Visual Prolog для чайников. Автор Эдуардо Коста.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.02.2014, 14:07  [ТС]
keidin, да я её качнул пару дней назад, почитываю. Вопрос не в том как сделать, тьюринг-полный язык позволяет что угодно, вопрос, почему так через одно место сделали, когда раньше было нормально... В этом вопрос...

За помощь спасибо, понял, что без извратов сделать подобное сложно.
0
Заблокирован
19.02.2014, 22:37
Цитата Сообщение от Psilon Посмотреть сообщение
...почему так через одно место сделали, когда раньше было нормально...
Psilon, Вы просто не курите VIP7 вообще.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.02.2014, 22:40  [ТС]
Винитархъ, без обид, но я со стороны вижу множество возможностей каждого языка, и не вижу ни одной причины, почему не оставить эту фичу такой, какой она была :dunno: Если же такая причина есть - пусть дадут ссылочку на описание, типа того, почему в каком-нибудь шарпе используется virtcall для вызова невиртуальных методов или почему Enumerator - мутабельная структура... Я считал это бредом, ознакомился, согласился, что правильно сделали. Есть ли подобное для данной ситуации? Я не нашел.
0
Заблокирован
20.02.2014, 21:26
Цитата Сообщение от Psilon Посмотреть сообщение
не вижу ни одной причины, почему не оставить эту фичу такой, какой она была
Я не понимаю о какой фиче идёт речь, так как эта тема представляет собой нагромождение нелепостей. Всё, что работало в VIP5, работает и в VIP7, кроме ссылочных доменов (reference).
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.02.2014, 21:53  [ТС]
Окей, вот конкретный вопрос: почему дважды печатается "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
99 / 99 / 14
Регистрация: 07.02.2013
Сообщений: 128
20.02.2014, 23:37
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

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

Спасибо за конструктивную помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2014, 09:55
Помогаю со студенческими работами здесь

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

Из Turbo Prolog в Visual Prolog - где будут отличия в коде?
ребята ,помогите. есть прога на турбо прологе,а нужно отредактировать под 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) %Структура Порода-Параметры и его список ...

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru