在Prolog中使用if else

时间:2014-09-27 16:48:09

标签: prolog

我想在Prolog中使用if else来实现这种东西。从C ++背景中我发现很难实现。我怎么能这样做?

if(X!=4 || Y!=3)
  printf("1");
else if(A!=4 || Y=3 && Z==2)
  printf("2");

2 个答案:

答案 0 :(得分:1)

尝试这段代码:

main:- (X\=4 ; Y\=3) -> write('1') ; 
       (A \=3 ; Y is 3 , Z is 2) -> write('2').

\=等于!=
;等于||
,等于&&
is等于=,但您也可以使用= ->等于then

我添加了四个read/1来测试代码:

main:- read(X),read(Y),read(A),read(Z),
       (X\=4 ; Y\=3) -> write('1') ; 
       (A \=3 ; Y is 3 , Z is 2) -> write('2').

我得到了:

3 ?- main.
|: 4.
|: 3.
|: 2.
|: 2.
2
true

第二个if有效

 6 ?- main.
|: 3.
|: 6.
1
true.

首先if有效

答案 1 :(得分:1)

如果Prolog中的其他内容只是

Condition → Then ; Else

RESP。

  Condition1 → Then1
; Condition2 → Then2
; …
; Else

您的C代码

if(X!=4 || Y!=3)
    printf("1");
else if(A!=4 || Y==3 && Z==2)
    printf("2");

会转换为

  (X \= 4; Y \= 3)       -> write('1')
; (A \= 4; Y = 3, Z = 2) -> write('2')
; true   % or drop this line, then it will raise a unification error

但请注意,您应该仅在外部循环中使用write/1,因为该函数是不纯的(执行顺序很重要)。

可能你应该写一些类似的东西:

( (X \= 4; Y \= 3)       -> Message = '1'
; (A \= 4; Y = 3, Z = 2) -> Message = '2'),
write(Message).

请注意Prolog是一种逻辑编程语言。 Ofttimes你会发现命令式编程语言的逐字翻译不是最好的解决方案。

举个例子,请看几天前我回答的一个问题:“Calculating whether number is prime in Prolog”:

势在必行:

is_prime(A) :-
    A > 1,                 % Negative numbers, 0 and 1 are not prime.
    is_prime(A, 2).        % Begin iteration:

is_prime(A, B) :-          % Test if A divides by B without remainder
    B >= A                 % The limit was reached?
    ->  true               %     Then it's prime.
    ;   0 is A mod B       % B divides A without a remainder?
    ->  false              %     Then it's not prime.
    ;   C is B + 1,        % Otherwise: C is B + 1
        is_prime(A, C).    % Test if C divides A.

逻辑:

is_prime(A) :-
    L is A - 1,            % L is floor(sqrt(A))  ← optimized upper bound
    \+ (between(2, L, X),  % Is there a number X between 2 and L
        0 is A mod X).     % that divides A without a remainder?

哪个更容易阅读?