download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Кон боб яде ли?

Автор
Съобщение
angelicstar
Пон, 17.01.11, 12:45
Ами нещо яко се задръстих с Prolog. Има нещо дето направо не отлепям с предиката not( ). Трябва да връща стойност false, когато в скобките има стойност true или да връща стойността на променливите, които не отговарят на дадено условие.
Примерно имаме зададено като факт, че кон яде боб - yade(kon, bob). и питаме системата вярно ли е, че кон боб не яде. Трябва да върне false. Или пък трябва not( true ) да връща false.

Ама не е така май или аз нещо много бъркам. Ясно, че в тоя блатен форум няма много хора да разбират та затова пускам подробен протокол от 1 диалог със системата. Понеже си мисля, че тука работата не е до знаене на езика, а някъде в логиката. Или моята логика е сбъркана, или на езика или и 2те.
В протокола зъз зелено е това, което аз пиша, с червено са системните отговори и промпта.

Цитат
Copyright (c) 1990-2010 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

1 ?- yade(kon, bob). /* Кон боб яде ли? */
true. /* яде */

2 ?- yade(kon, X). /* Какво яде конят? */
X = bob.

3 ?- yade(X, bob). /* Кой яде боб? */
X = kon.

4 ?- not(yade(kon, bob)). /* Вярно ли е, че кон боб не яде */
false. /* Не е вярно, яде си! */

5 ?- not(yade(X, bob)). /* Има ли някой да не яде боб? Кой не яде боб? */
false. /* ?!? */
/* Това false може да значи 2 неща: */
/* 1. Такова животно нема */
/* 2. Не е известно, в базата данни няма факти */

Ами тогава да вкараме още факти та да няма двусмилици. Примерно yade(kote, meso).
Сега базата е така:
yade(kon, bob).
yade(kote, meso).

Проверяваме правилно ли работи.
Цитат
6 ?- yade(kote, meso). /* Коте месо яде ли? */
true. /* правилно */

7 ?- yade(kote, X). /* Какво яде котето? */
X = meso. /* правилно */

8 ?- yade(kote, bob). /* Коте боб яде ли? */
false. /* правилно */

9 ?- yade(kon, meso). /* Кон месо яде ли? */
false. /* правилно */

10 ?- yade(X, Y). /* Кой какво яде? */
X = kon,
Y = bob ;
X = kote,
Y = meso.

/* правилно */
/* И сега почва шаш */
11 ?- not(yade(X, bob)). /* Кой не яде боб? */
false.
/* А пък трябва да отговори Х=kote */
12 ?- not(yade(kon, X)). /* Какво не яде конят? */
false.
/* А пък трябва да отговори Х=meso */

Та не знам вече. Омешах се абсолютно.
Някакви идеи къде може да е издънката?
редактиран от angelicstar на 17.01.11 12:46
phrozencrew
Пон, 17.01.11, 20:54
Мисля, че само с not() няма да стане. Не ми се вярва not-а да връща нещо по различно от истина или лъжа, макар, че не познавам езика до толкова. По-скоро, ако вкараш едно filndall и not() в него, би могло да стане.
phrozencrew
Пон, 17.01.11, 21:00
Всъщност има и много по-логичен отговор.... Хмммм :
yade(X,Y), not(yade(X, bob)).

Това трябва да работи, но не го пробвах, щото умирам от глад!!!! Уаууууу.....

dreamskill
Пон, 17.01.11, 23:24
еми първото нещо, за което бях се сетил е следното:
-Кон боб яде ли?
-Като е гладен дори и леща яде :D
tegote
Вто, 18.01.11, 00:02
Дядо ми винаги казваше "тоя боб е за конете"! Това е когато му донеса голям боб. Всеизвестно е че коня яде боб, спор няма. Леща също, ще ги хруска варивата без да са варени.
angelicstar
Вто, 18.01.11, 14:32

RE: Кон боб яде ли?

” Всъщност има и много по-логичен отговор.... Хмммм :
yade(X,Y), not(yade(X, bob)).

Това трябва да работи, но не го пробвах, щото умирам от глад!!!! Уаууууу..... „

Работи. Ама не ми решава проблема. Дава ми отговор на въпроса "Какво ядат тия, които не ядат месо.
Х=kote
Y=meso.

Пък аз питам само кой не яде месо.
Все не разбирам как работи not(). Защо ми дава само 1 false при положение, че в базата има данни за животно, което не яде боб? Защо връща логическа стойност, а не свързана с променливата?
Явно аз нещо криво интерпретирам формализма на not(). Само че въобще не се сещам за друга интерпретация. Някой сеща ли се?
Освен сега да седна сега да уча и предикатно смятане.
Отделно пък на 1 сайт видях съвет да не се оставят несвързани променливи вътре в not(), но не обясняват защо.

-----
Ама случайно открих 1 майтап в SWI-Prolog. Като питаш за стойност на несвързана променлива изкарва това:

Цитат
27 ?- X.
% ... 1,000,000 ............ 10,000,000 years later
%
% >> 42 << (last release gives the question)

...по Дъглас Адамс...
phrozencrew
Вто, 18.01.11, 18:28
Ай стига бре! Още ли нямаш решение? Ето ти едно:
yade(X,Y), Y\=meso, write(X), nl, fail.

PS: Все забравям за стрипването на слашовете.. пфууу. Дано да го оправят някой ден!
Тествано е под Gnu Prolog.

редактиран от phrozencrew на 18.01.11 18:30
редактиран от phrozencrew на 18.01.11 18:32
kookki
Вто, 18.01.11, 21:21

Аз се сещам за едни таблици за определяне на истстина и лъжа. Учих ги за един изпит по един тъп предмет (теоритични основи на информатиката) и сега не се сещам къде са ми забутани лекциите, но като ги намеря ще пиша.
Имаше нещо от сорта на: (a, b)->c и подобни глупости и се разглеждаха следствията при 1 и 0 за всяка една от променливите в таблицата. Имаше полезни неща в предмета , но не си правих труда да ги уча, защото преподавателя и асистентката бяха големи дразнители.

stoqncho
Вто, 18.01.11, 22:04

RE: Кон боб яде ли?

” Аз се сещам за едни таблици за определяне на истстина и лъжа. Учих ги за един изпит по един тъп предмет (теоритични основи на информатиката)... „

Ей такива ги учих в даскало по предмет "Психология и Логика"(учебника май беше разделен на две части "Психология" и "Логика" това е в 2-та част) обаче и нищо не разбрах де. Тука има малко инфо, но нашата учителка го беше направила в таблица и беше по-разбираемо.

angelicstar
Сря, 19.01.11, 13:53

RE: Кон боб яде ли?

” Ай стига бре! Още ли нямаш решение? Ето ти едно:
yade(X,Y), Y=meso, write(X), nl, fail.

PS: Все забравям за стрипването на слашовете.. пфууу. Дано да го оправят някой ден!
Тествано е под Gnu Prolog. „

Така вече стана. Даже минава и без "...write(X),..".
Сано не знам аз ли тъпо обяснявам какъв ми е проблемът, или проблемът е тъп. Значи: за сега не ми е за работещ код, а да разбера защо not(yade(X, bob)) не работи. Даже по-гадно стана. Твоето yade(X,Y), not(yade(X, bob)) става, ама само с not(yade(X, bob)) не става. Искам да разбера какво ми е бъгавото та утре да не се чудя пак.
Ясно ми е вече, че повредата е в моя телевизор. Ама въпросът е да не става нужда да го нося на сервиз като река да сменя канала.

” Ей такива ги учих в даскало по предмет "Психология и Логика"(учебника май беше разделен на две части "Психология" и "Логика" това е в 2-та част) обаче и нищо не разбрах де. Тука има малко инфо, но нашата учителка го беше направила в таблица и беше по-разбираемо.
Ами знам ги тия таблици. Някои пъти ми вършат хубава работа като трябва да разлепя някое сложно условие на по-прости. Иначе при цикли със сложни условия стават яки майтапи.
А пък тука нещо става и отрицателния предикат не работи според таблиците.
phrozencrew
Сря, 19.01.11, 19:21

RE: RE: Кон боб яде ли?

” Сано не знам аз ли тъпо обяснявам какъв ми е проблемът, или проблемът е тъп. Значи: за сега не ми е за работещ код, а да разбера защо not(yade(X, bob)) не работи. Даже по-гадно стана. Твоето yade(X,Y), not(yade(X, bob)) става, ама само с not(yade(X, bob)) не става. Искам да разбера какво ми е бъгавото та утре да не се чудя пак. „
Трябва да четеш документацията за интерпретатора, който ползваш. Ако си с SWI-Prolog, тогава в документацията пише да използваш '\+' вместо 'not'. Просто "нот" вече не се поддържа и за това са възможни бъгове:
Цитат
not(:Goal)
    True if Goal cannot be proven. Retained for compatibility only. New code should use \+/1. „
Ако ти се чете повече за отрицанието '\+', потърси в google с критерий "Negation as Failure". Абсолютно случаен резултат.
По новите стандарти кода ти би трябвало да изглежда така:
yade(X,Y), \+ yade(X,bob), write(X), fail.

Резултата в SWI-Prolog:

angelicstar
Чет, 20.01.11, 12:27
По твоя начин става.
Опитвам да разбера защо моят не става. И с not и с \+ резултатът е все тоя. Значи не е до лексиката. Имам някаква грешка в мисленето, ама не мога да разбера каква.
Пък докато мисля криво няма полза да знам кой е правилният начин. Помешах се направо!
angelicstar
Пет, 21.01.11, 14:23
Ами светна ми накрая. Цели 2 грешки съм правила в интерпретацията.
Намерих в 1 руски форум формализма на not():
not(P) :- P, !, fail; true.

Значи веднага става ясно защо не може да върне свързана променлива. Винаги връща само отрицание на израза Р. Връща false при задоволяване на Р и true при пропадане. Гледа се само задоволяване/пропадане, а променливите въобще не играят. Това ми е било 1-та грешка.
Както го правя аз получавам само стойност за целта. А пък по твоя начин има конюнкция на променливата и на целта. Затова твоето работи.
Аз съм си мислела, че "Кой не яде боб?" и "Има ли някой да не яде боб" са 1 и също питане, а те не са. Това ми е 2-та грешка.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.