Кон боб яде ли?
Автор |
|
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 */ „
Та не знам вече. Омешах се абсолютно. Някакви идеи къде може да е издънката? | | 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. | | 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-та грешка. | | Коментар |