Это комментарий в ответе, потому что он не будет правильно форматироваться в комментарии.
То, что большинство новичков в Прологе не осознают достаточно рано, это то, что Пролог основан на логике c (что они реализовать), и три базовых оператора logi c and
, or
и not
являются операторами в Прологе, а именно (, ; \+
). Эти операторы не понимают, кто они на самом деле.
Начиная с not
, который в Прологе был not / 1 , но теперь обычно (\ +) / 1 .
?- \+ false.
true.
?- \+ true.
false.
или использование более старого not/1
, которое вы можете использовать, но все равно, что говорить в пьесе Шекспира, потому что это больше не делается таким образом. Я включил это здесь, потому что многие более старые примеры все еще имеют его в примерах таким образом.
?- not(true).
false.
?- not(false).
true.
Далее - and
, что в Прологе равно , / 2 .
Причина, по которой многие новые пользователи Prolog не видят это как logical and
, заключается в том, что ,
во многих других языках программирования рассматривается как разделитель операторов ( Ref ) и действует очень как ,
в предложении Engli sh. Вся проблема с занижением ,
в программировании заключается в том, что он действительно оператор и используется для стольких вещей, что программисты даже не понимают, что его почти всегда следует рассматривать как оператор, но с разными значениями (оператор перегрузка). Кроме того, поскольку ,
используется в качестве разделителя операторов, операторы обычно помещаются в отдельные строки, а некоторые программисты даже считают, что запятая (,
) - это просто конец оператора, а точка (.
) - конец строки. в предложении; это не способ думать об этих односимвольных операторах. Они операторы, и их нужно рассматривать и понимать как таковые.
Итак, теперь, когда вы знаете, откуда и как приходят ваши идеи, которые вызывают у вас проблемы, в следующий раз, когда вы увидите запятую ,
или точку .
на языке программирования действительно нужно время, чтобы подумать о том, что это значит.
?- true,true.
true.
?- true,false.
false.
?- false,true.
false.
?- false,false.
false.
Наконец, логично или что в Prolog равно ; / 2 или в DCG появятся как | / 2 . Использование |/2
в DCG такое же, как |
в BNF .
?- true;true.
true ;
true.
?- true;false.
true ;
false.
?- false;true.
true.
?- false;false.
false.
Интересно отметить, что результаты использования или (;
) в Пролог состоит в том, что они вернутся, когда истинно столько раз, сколько одно из утверждений истинно и ложно, только когда все предложения ложны. (Не уверен, что предложение является правильным словом для использования здесь). например,
?- false;false;false.
false.
?- false;false;true.
true.
?- true;false;true.
true ;
true.
?- true;true;true.
true ;
true ;
true.
Если вы не прислушались к моему предупреждению о размышлениях об операторах, когда видите их, то сколько из вас смотрели на
?- true,true.
true.
и не смотрели думаю, что в исходном коде это обычно пишется как
true,
true.
, а ,
выглядит как конец оператора. ,
- это не конец оператора, это оператор logical and
. Поэтому сделайте себе одолжение и будьте очень критичны даже к одному ,
, так как он имеет специфическое значение c в программировании.
Обратный путь к реализации этой идеи - использование оператора сложения (+
) как оператор завершения оператора, которым он не является, но для кого-то новичка в математике может быть ошибочно принят за то, что видно из этого переформатирования простого математического выражения.
A =
1 +
2 +
3
Это не то, как полезно видеть простое математическое выражение, но так же, как некоторые программисты смотрят на использование оператора ,
.
В течение многих лет я видел одну вещь, которая разделяет программистов, которые легко получают это от программистов, которые борются с этим, все их карьеры - те, которые преуспевают в классе парсинга , легко получают это, потому что они должны проанализировать синтаксис до токенов, таких как ,
, а затем преобразовать это в семантика языка.
Подробнее см. В разделе 1.2. Элемент управления на стр. 23 этой бумаги .
РЕДАКТИРОВАТЬ
Вам действительно необходимо использовать контрольные примеры. Вот два, чтобы вы начали.
Это делается с помощью SWI-Prolog
:- begin_tests(family_relationship).
sibling_test_case_generator(ggm ,gga ).
sibling_test_case_generator(gga ,ggm ).
sibling_test_case_generator(gm ,ga ).
sibling_test_case_generator(ga ,gm ).
sibling_test_case_generator(m ,a ).
sibling_test_case_generator(a ,m ).
sibling_test_case_generator(self,s ).
sibling_test_case_generator(s ,self).
test(01,[forall(sibling_test_case_generator(Person,Sibling))]) :-
sibling(Person,Sibling).
cousin_1_0_test_case_generator(gm ,c12a).
cousin_1_0_test_case_generator(ga ,c12a).
cousin_1_0_test_case_generator(m ,c11a).
cousin_1_0_test_case_generator(a ,c11a).
cousin_1_0_test_case_generator(self,c1 ).
cousin_1_0_test_case_generator(s ,c1 ).
cousin_1_0_test_case_generator(d ,n ).
cousin_1_0_test_case_generator(c12a,gm ).
cousin_1_0_test_case_generator(c12a,ga ).
cousin_1_0_test_case_generator(c11a,m ).
cousin_1_0_test_case_generator(c11a,a ).
cousin_1_0_test_case_generator(c1 ,self).
cousin_1_0_test_case_generator(c1 ,s ).
cousin_1_0_test_case_generator(n ,d ).
test(02,[nondet,forall(cousin_1_0_test_case_generator(Person,Cousin))]) :-
cousin(Person, Cousin, 1, 0).
:- end_tests(family_relationship).
РЕДАКТИРОВАТЬ
By! Оригинал: J Di Вектор: Мэтт Лейдхольм ( LinkTiger ) - собственная работа на основе: Cousin tree.png , Publi c Domain, Link