2012-10-26 28 views
7

Jestem nowy w Mathematica (v8) i używam go do programowania logiki zdaniowej.Mathematica If-then vs. Implies

Zastanawiam się, jaka jest różnica między operatorami If i Implies. Na przykład:
zarówno If[p,q], jak i Implies[p,q] dla dla (zgodnie z oczekiwaniami).

Ale gdy próbuję uzyskać SatisfiabilityInstances, mam następujące:

SatisfiabilityInstances[If[p, q], {p, q}] 
(* 
    {{True, True}} 
*) 

chyba poprosić go o więcej instancji:

SatisfiabilityInstances[If[p, q], {p, q}, All] 

SatisfiabilityInstances :: boolv: „Jeśli [p , q] nie jest wartością boolowską ma wartość {Fałsz, prawda}.

Jednak:

SatisfiabilityInstances[Implies[p, q], {p, q}, All] 

zwraca oczekiwane z:

(* {{True, True}, {False, True}, {False, False}} *) 

Co jest przyczyną tej różnicy wyjść?

Odpowiedz

4

To jest to, co powiedział - If nie jest boolowskie, tj. Zwraca nie tylko wartość true lub false. Wypróbuj If[False,True], a nie zobaczysz żadnego wyniku. If[a,b,c,d] może zwracać dowolne b, c oraz d, nie tylko Boolean, na przykład If[True,2] zwraca 2. Tak więc, If służy do rozgałęziania (nawet będąc funkcjonalnym), podczas gdy Implies jest normalną funkcją Boolean.

P.S. Ah, Implies może również zwrócić 2. Różnica polega na tym, że If[False,True] nic nie zwraca, więc funkcja SatisfiabilityInstances nie może znaleźć prawdziwego obszaru.

P.P.S. Dokładniej, jeśli pierwszy argument If[] to False, wówczas zwraca trzeci argument. Kiedy jest nieobecny, nic nie zwraca.

+0

Czy mnie skierować do dobrego tutoriala? Czytałem dokumentację Mathematica, ale nie zdawałem sobie sprawy, że możliwe jest nadanie "Jeśli" czterech wartości (tylko trzy w przypadku, gdy-else). "Jeśli [a, b, c, d]" zwraca "d" bez przypisanych wartości prawdy - dlaczego tak jest? @Dims – QuietThud

+0

@QuietThud 'Jeśli [warunek, klauzula true, klauzula false, klauzula nieważna lub fałszywa]' –

+0

Dziękuję @belisarius. =) Byłbym wdzięczny za rekomendację, jeśli chodzi o matematykę. programowanie to źródło nauki - Dokumentacja działa lepiej jako odniesienie. – QuietThud

3

Możesz spróbować:

SatisfiabilityInstances[If[p, q, Not[q]], {p, q}, All] 
+0

To wyjaśnia komunikat o błędzie, dziękuję. – QuietThud