Как преобразовать логические правила в нотацию Prolog?

#prolog

#prolog

Вопрос:

Это мое задание: введите описание изображения здесь

Моей попыткой было:
а) Если Фред — отец Майка, то Фред — предок Майка.

 father( X, Y ). /* X is father of Y */
ancestor( fred, mike ) :- father( fred, mike ). 
  

б) Животное является млекопитающим, если это человек или его родители были млекопитающими.

 parent( X, Y ). /* X is parent of Y */
human( X ).     /* X is human */
mammal( X ) :- human( X ).
mammal( X ) :- parent( P, X ), mammal( P ).
  

c) Вы достигли конечного состояния, если вы счастливы, здоровы и мудры.

 happy( X ).   /* X is happy */
healthy( X ). /* X is healthy */
wise( X ).    /* X is wise */
attain_ultimate_state( X ) :- happy( X ), healthy( X ), wise( X ).
  

d) Каждая собака любит всех людей.

 dog( X ).    /* X is a dog */
people( Y ). /* Y is human */
like( X, Y ) :- dog( X ), people( Y ).
  

e) «Лейкерс» выиграют игры 2, 3, 5 и 7, но проиграют остальные 3 игры серии с «Нью Орлеан».

 game( one ).
game( two ). 
game( three ).
game( four ).
game( five ).
game( six ).
game( seven ).

win( laker, new_orleans, game( two ) ).
win( laker, new_orleans, game( three ) ).
win( laker, new_orleans, game( five ) ).
win( laker, new_orleans, game( seven ) ).
lose( laker, new_orleans, game( one ) ).
lose( laker, new_orleans, game( four ) ).
lose( laker, new_orleans, game( six ) ).
  

f) Если P и Q, то R или S

 and( X, Y ).     /* X and Y */
or( X, Y ).      /* X or Y */
imply( X, Y ).   /* X imply Y */
or( r, s ) :- and( p, q ).
  

g) P подразумевает, что Q эквивалентно разделению not P на Q.

 and( X, Y ).     /* X and Y */
or( X, Y ).      /* X or Y */
imply( X, Y ).   /* X imply Y */
imply( p, q ) == or( not( p ), q ).
  

h) P exclusive_or Q — это когда P inclusive_or Q , но не (P и Q).

 and( X, Y ).         /* X and Y */
or( X, Y ).          /* X or Y */
imply( X, Y ).       /* X imply Y */
imply( p, q ) == or( not( p ), q ).
exclusive_or( X, Y ). /* X exclusive or Y */
inclusive_or( X, Y ). /* X inclusive or Y */
exclusive_or( p, q ) :- inclusive_or( p, q ), not( and( p, q ) ).
  

i) Джек разочарован, когда идет дождь и кто-то из учеников пропускает занятия.

 disappointed( X ). /* X is disappointed */
missed_class( X ). /* X missed class */   
rain. /* it rains */
disappointed( jack ) :- rain, missed_class( _ ).
  

j) Быть или не быть, вот в чем вопрос.

 to_be( X ).
question( X ) :- to_be( X ).
question( X ) :- not( to_be( X ) ).
  

Мы используем Concepts of Programming Languages by Robert W. Sebesta в качестве учебного пособия для этого курса. К сожалению, в книге очень мало примеров о том, как преобразовать логические правила в нотацию Prolog. Хотя я закончил их все, большая часть моего ответа была догадкой. Итак, мне интересно, может ли кто-нибудь дать мне подсказку или предложение по моей работе выше. Приветствуются любые идеи или отзывы.

Спасибо,

Комментарии:

1. Боже, длинный пост. Вы не беспокоитесь о том, что остальная часть вашего класса увидит ваше задание дословно онлайн?

2. @mssingno: Все в порядке, я не возражаю. Я заплатил за свой класс, поэтому все, что я узнал, важнее.

Ответ №1:

Я могу только представить, что я в вашем классе, поскольку у нас одинаковые вопросы и книга 😉 Опубликовано всего 1 час назад, а оно уже появилось в Google, лол

a) То же самое.

б) В настоящее время это было бы верно до тех пор, пока есть один родитель, который является млекопитающим, но поскольку в задаче указано «родители», и я 2-й догадываюсь обо всем, о чем спрашивает нас профессор, я специально проверил, что есть мать (M, X) и отец (F, X) и что M и F являются млекопитающими.

c) То же самое

d) более или менее то же самое: лайки (собака, X):-человек (X).

e) вздохи Это то, что я показал профессору, и он не казался довольным. Он сказал, что я усложнил это, чем это должно было быть… но он бесполезен в том, что это означало.

 game(1,newOrleans).
game(2,city1).
game(3,city2).
game(4,newOrleans).
game(5,cit2).
game(6,newOrleans).
game(7,city1).
win(X):-game(X,Y), not(city(Y)).
city(newOrleans).
  

f) Вам не нужно подразумевать там, поскольку:- означает подразумеваемый. Я все еще работаю над f-h. Я попросил профессора помочь с этим, и все, что я смог от него добиться, это то, что мне не нужен p (x) и я могу просто использовать p и q.

j) То же самое, но у меня они в одной строке с ‘;’, чтобы выполнить или

вопрос ( X):- to_be(X); не(to_be(X)).

В чем я не прав на 100%. Он может быть вопросом, который должен быть «быть» или «не быть» вопросом (tobe); вопрос (nottobe).

 quote(tobe).
quote(nottobe).
question(X):-quote(X).
  

Обновить

Забыл 5i), это то, что у меня есть.

 rain(tue). 
skipped_class(tue,frank).
disappointed(jack,Day):-rain(Day), skipped_class(Day,Student).
  

джек будет разочарован во вторник, так как идет дождь, а Фрэнк пропустил. Не уверен, что я все сделал правильно, но я собираюсь придерживаться этого.


ОБНОВЛЕНИЕ 2

Я только что понял, что могу использовать true, false в качестве значений, а не p. и q .

 and(P,Q):-P,Q.
inclusive_or(P,Q):-P;Q.
exclusive_or(P,Q):-inclusive_or(P,Q),not(and(P,Q)).
  

Exclusive_or из P и Q будет истинным, если его включающее или (либо P, либо Q должно быть истинным), а не оба p и Q являются истинными.

?-exclusive_or(истина,true). false.

Комментарии:

1. @TheDPQ: Спасибо, приятель! Я предполагаю, что мне придется переделать f-h, и нам, возможно, придется добавить правила для exlusive_or и inclusive_or, преобразовав их в эквивалентную логику and и or .

2. 5e) win(X):-member(X,[2,3,5,7]).

3. 5f) p. q. или (X, Y):-p, q. все еще кажется странным, но я не думаю, что нам нужна функция AND в качестве подцели, поскольку ‘,’ делает это за нас.

4. and , or и :- — это то, что у нас было. Я думаю, мы должны придумать что-то, что охватывает эти операции.

5. Почему у вас было дополнительное свойство для 5i)? Я не понимаю. Вы уверены насчет 5e). Я не понимаю, как мы можем интерпретировать это таким образом. Я предполагаю, что у него должно быть как минимум два параметра, один для laker и один для new orleans. В противном случае они не имеют отношения друг к другу.