【问题标题】:Use if else in Prolog在 Prolog 中使用 if else
【发布时间】:2014-09-27 16:48:08
【问题描述】:

我想在 Prolog 中使用 if else 来实现这种类型的东西。由于来自 C++ 背景,我发现它很难实现。我该怎么做???

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

【问题讨论】:

  • !! 应该是 ||?
  • @ 表示 X 不等于 4 或 Y 不等于 3 在第一个 if 和第二个如果它表示 X 不等于 4 或 Y =3 AND Z 等于 2。 | |在 C++ 中表示 OR,&& 表示 AND,!是否定的
  • @Kay 哦,抱歉打错了。
  • X!=4 在这两种情况下都会出现。如果这是普通的 C 代码,那么 X!=4 在第二个 if 块中不能为真。
  • 对不起,我只是想要一个例子来将这些类型的代码从 C 转换为 Java,我现在已经编辑了代码。抱歉给您带来不便。

标签: prolog


【解决方案1】:

Prolog 中的 If-else 很简单

Condition → Then ; Else

分别

  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 是一种逻辑编程语言。通常你会发现从命令式编程语言逐字翻译并不是最好的解决方案。

举个例子,看看我几天前回答的一个问题:“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?

哪个更容易阅读?

【讨论】:

  • 您还应该提到YZ 可能会统一。而<translated code with X unset>, X = 4 仍然产生true 并打印1
【解决方案2】:

试试这段代码:

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

\= 等于 !=
; 等于 ||
, 等于 &&
is 等于 =,但您也可以为此使用 =
-> 等于 @ 987654332@

我添加了四个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 工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多