CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум Prolog

Ответ Создать новую тему
 
Старый 03.02.2012, 21:31   #1
OLMER
Новичок
 
Регистрация: 28.05.2010
Сообщений: 39
Репутация: 0 (0)
По умолчанию Не выводить значение переменной

Прошу не пинать, толь начинаю учить Prolog.
Как используя раздел GOAL не выводить значения переменных, которые используются только для "условий" вывода.
Вот пример, так вывести записи с жёстко заданным "виталий_александрович":
Код Prolog
1
2
3
4
 
GOAL
br_sist(виталий_александрович,Y),person(Y,ж,_,_).
 
И получаем ответы в виде: "Y = ...".

А так при помощи переменной Х мы этого самого "виталий_александрович'а" выбираем запросом "parents(X, _ , дмитрий_витальевич)". В итоге:
Код Prolog
1
2
3
 
br_sist(X,Y),person(Y,ж,_,_),parents(X,_,дмитрий_витальевич).
 
Ответ: "Х = виталий_александрович, Y = ..."
Выполняется замечательно, но как убрать вывод переменной Х в результате? Так как имеет одно и то же значение - вывод инфы "некрасивый".

P.S. Вопрос-оффтоп - как подружить копирование кириллицы из Пролога в буфер? Копирует в кривой кодировке, а каждый раз её перегонять через что-то подобное "Штирлицу" лень. Есть решения готовые?
То бишь в Fonts установлено "Cyrrilic", и в программе текст нормально воспроизводится, но при копировании куда-либо - кракозябры. Как привести в порядок перегонку кодировки "CP1252 --> CP-1251"?
OLMER вне форума
Другие темы раздела
Задача "Семья". Prolog
Надо создать программу, где отображены все члены семьи и кто кому кем приходится... У кого-нибудь есть такая? Вообще не представляю, как делать, а делать надо.. Задача "Семья".
Prolog Возведение в степень - непонятная ошибка.
Нужно написать програму для возведения числа в степень 2-мя способами (рекурсивным и итерационным). Попробовал зделать сначала итерационным и заступорился выбивает ошибку: Basic domain becomes reference domain: unsigned. Не знаю как это исправить ибо в прологе я новичок. predicates .... Возведение в степень - непонятная ошибка.
Старый 03.02.2012, 22:21   #2
Грымзик
Модератор
 
Аватар для Грымзик
 
Регистрация: 14.09.2009
Сообщений: 2,093
Репутация: 2056 (1056)
По умолчанию Re: Не выводить значение переменной

Не выводить нельзя, можно писать дополнительные предикаты.
Код Prolog
1
2
3
p(Y):-br_sist(X,Y),person(Y,ж,_,_),parents(X,_,дмитрий_витальевич).
goal
p(Y).
С кодировкой действительно криво, самой бы интересно было узнать. Но перегонять ничего не надо. Вообще фигня начинает твориться только после того, как первый раз служебное слово напишешь, поэтому можно просто перезапустить компилятор и все можно будет нормально скопировать. Да и просто блокнотом открыть можно.
Грымзик вне форума
Старый 03.02.2012, 22:33  [ТС]   #3
OLMER
Новичок
 
Регистрация: 28.05.2010
Сообщений: 39
Репутация: 0 (0)
По умолчанию Re: Не выводить значение переменной

Спасибо, для решения проблем с кодировкой можно, как вариант, юзать: http://www.artlebedev.ru/tools/decoder/advanced/
По поводу доп. предикатов - это понятно, по условию лабы должен быть только запрос в GOAL, вот и думал - может как красивее можно вывести.
И ещё вопрос. Вот при таких запросах, как указывал выше (совмещённых) ругается на тип, если сравнивать с разных предикатов одной переменной, хотя всё вроде верно. Помогло только замена используемых доменов с типом symbol на "жёсткое" устоновление в тип symbol (без доменов). В смысле тип у обоих доменов один - symbol, но при запуске ругается. У всех так? Или я что-то не правильно понял?
Пример:
Код Prolog
1
2
3
4
5
6
7
8
9
10
11
12
 
DOMAINS
father,mother,child,name_and_patronymic,sex,profession = symbol
age=integer
 
PREDICATES
nondeterm parents (father, mother, child)
nondeterm person (name_and_patronymic, sex, age, profession)
.....
GOAL
person(Y,_,Age,_),parents(Y,_,X),parents(_,X,дмитрий_витальевич).
 
В итоге - Illegal variable type... в местах:
person(Y,_,Age,_),parents(Y,_,X),parents(_,X,дмитрий_витальевич).
OLMER вне форума
Старый 03.02.2012, 22:51   #4
Грымзик
Модератор
 
Аватар для Грымзик
 
Регистрация: 14.09.2009
Сообщений: 2,093
Репутация: 2056 (1056)
По умолчанию Re: Не выводить значение переменной

Да, это нормально. Если хотите использовать домены, то более конструктивно их создавайте. Например зачем father, mother, child, когда это можно заменить одним доменом person. Или можно с кучей типов, но тогда вот так делать
a(X),b(Y),X=Y.
Грымзик вне форума
Старый 04.02.2012, 02:26  [ТС]   #5
OLMER
Новичок
 
Регистрация: 28.05.2010
Сообщений: 39
Репутация: 0 (0)
По умолчанию Re: Не выводить значение переменной

Так и делал (добавлял дополнительное условие равенства в конце), но думал - может есть более "правильный" вариант. А по поводу общего домена, то так расписано для удобства восприятия - где указывается отец, где мать, а где сын, что бы у человека взглянувшего на код не возникло вопросов (с комментариями не хотелось заморачиваться, хотел читабельный код).

Добавлено через 3 часа 28 минут
Созрел новый вопрос - как выставить приоритет при создании конструкции из логических операций? На обычные скобки ругается. Что-то вроде:
Код Prolog
1
2
3
4
5
6
7
8
9
 
PREDICATES
charval(char).
CLAUSES
charval(CharParam):-
    readchar(CharParam),
    ((CharParam)>=65,CharParam<=90);
    (CharParam>=97,CharParam<=122)).
 
То есть: ((X и У) или (А и Б)).
Почему-то код выше не хочет воспринимать, и ругается на скобки.
OLMER вне форума
Старый 04.02.2012, 13:43   #6
Грымзик
Модератор
 
Аватар для Грымзик
 
Регистрация: 14.09.2009
Сообщений: 2,093
Репутация: 2056 (1056)
По умолчанию Re: Не выводить значение переменной

В данном диалекте скобки в логических конструкциях недопустимы.
Код Prolog
1
2
3
4
p(CharParam):-CharParam>=65,CharParam<=90,write("AAA").
p(CharParam):-CharParam>=97,CharParam<=122,write("BBB").
 
charval(CharParam):-readchar(CharParam),p(CharParam).
Грымзик вне форума
Старый 04.02.2012, 14:01   #7
aag
Форумчанин
 
Аватар для aag
 
Регистрация: 03.11.2011
Сообщений: 123
Репутация: 47 (61)
По умолчанию Re: Не выводить значение переменной

Или схалтурить:
charval(CharParam):-readchar(CharParam),upper_lower(CharParam,X),X>96,X<123.
aag вне форума
Старый 04.02.2012, 15:28  [ТС]   #8
OLMER
Новичок
 
Регистрация: 28.05.2010
Сообщений: 39
Репутация: 0 (0)
По умолчанию Re: Не выводить значение переменной

Благодарю за ответы.
aag, выше я написал подобную конструкцию, с одним диапазоном через условие И проблем и так не было бы.
Надо помимо этого диапазона использовать ИЛИ ещё один диапазон. А в таком виде это невозможно.
Решил проблему через дополнительный предикат, как предложила Грымзик.
OLMER вне форума
Старый 04.02.2012, 18:11   #9
aag
Форумчанин
 
Аватар для aag
 
Регистрация: 03.11.2011
Сообщений: 123
Репутация: 47 (61)
По умолчанию Re: Не выводить значение переменной

Цитата Сообщение от OLMER Посмотреть сообщение
Благодарю за ответы.
aag, выше я написал подобную конструкцию, с одним диапазоном через условие И проблем и так не было бы.
Надо помимо этого диапазона использовать ИЛИ ещё один диапазон. А в таком виде это невозможно.
Решил проблему через дополнительный предикат, как предложила Грымзик.
Ну, я уточнил "Или схалтурить")))

В ВИПе Ваше конструкция без лишних скобок замечательно жужжит(про ИЛИ, а не про isAlpha()):
Код Prolog
1
2
        (    CharParam>=65,CharParam<=90;
              CharParam>=97,CharParam<=122   ).
Удачи!!!
aag вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 05.02.2012, 09:25  [ТС]   #10
OLMER
Новичок
 
Регистрация: 28.05.2010
Сообщений: 39
Репутация: 0 (0)
По умолчанию Re: Не выводить значение переменной

aag, в таком виде сразу выполняется И, затем ИЛИ, затем опять И, явно же другой приоритет действий. Но всё равно спасибо за потраченное время )
OLMER вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
JavaScript Выводить картинку из в зависимости от значения переменной
задача такая есть переменная которая принимает три значения 0,100,200 задача если 0 то ничего не происходит если 100 показать картинку 1.jpg если 200 показать картинку 2.jpg как это можно организовать подскажите или наведите на мысль
arahmanov
C# .NET Как получить/установить значение переменной по названию (название берется из строковой переменной)
собственно сабж
ArchDuke
С++ для начинающих Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll)
GetProcAddress не берет значение переменной из *.dll Не могу понять почему. Помогите. ------------------------- *********** DLL.h *********** #define DLL __declspec(dllexport) extern PINCRYPT HINSTANCE Lib_XXX;
NiТR0
PHP для начинающих как передать значение переменной javaScript переменной PHP
Сначала я пишу кусочек скрипта на javaScript. У меня там есть допустим переменная Day. В результате выполнения скрипта она имеет орпределенное значение. Потом я хочу это переменную обработать ПХП скриптом в том же HTML-файле.Можно ли просто написать $phpday=$day. Или это не будет работать.Если не...
sorceress
Visual Basic Как переменной описанной в программе присвоить значение переменной в Conditional Compilation Arguments?
Kak mozhno peremennij opisanoj v programme prisvoit` znachenie peremennoj v Conditional Compilation Arguments??? Eto nado chtoto tipa etogo pista`???: Dim strTest As String strTest=Peremennaya Tak , chto li? no u menya ne rabotaet! mozhet kto znaet kak delat`? Zaranee spasibo, Web-Gear
AASoft
Опции темы

Текущее время: 05:02. Часовой пояс GMT +4.

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