【问题标题】:Prolog if sentence conditionsProlog if 语句条件
【发布时间】:2018-11-23 17:52:40
【问题描述】:

所以基本上我试图检查rule 的中间是否满足某些条件但条件取决于另一个变量。
在我的情况下,如果 Num1 是 10,那么 Num2 不能是 1 - 如果它是 1 则失败,如果 Num1 是 20,那么 Num2 不能是 2。

这是我想出来的

do_function(Num1, Num2):-
   write('first'),
   ((Num1 = 10, Num2 \= 1); (Num1 = 20, Num2 \= 2)),
   write('last').

与之合作的query

 ?- do_function(20, 1).
 firstlast
 true.

但是有了这个query 我明白了:

?- do_function(10, 2).
firstlast
true ;
false.

在这种情况下,它出于某种原因写入firstlast,但在我的实际代码中,它执行第一部分然后崩溃,因为它得到了false

【问题讨论】:

    标签: prolog


    【解决方案1】:

    如果您可以确保仅使用绑定参数调用检查谓词,则使用 if-then-else 控制结构。例如

    do_function(Num1, Num2) :-
        (   Num1 =:= 10 ->
            Num2 =\= 1
        ;   Num1 =:= 20 ->
            Num2 =\= 2
        ;   true
        ).
    

    还可以查看library(clpfd)。根据您要解决的问题,使用约束可能是更好的选择。

    【讨论】:

    • 谢谢,这正是我想要的,但你能告诉我==:=\==\= 之间的区别吗?或者指出我的来源。
    • =:=/2=\=/2 谓词是算术比较谓词。 =/2\=/2 谓词是术语统一谓词。有关详细信息,请参阅您正在使用的 Prolog 系统的文档。
    【解决方案2】:

    只需翻译您的规则(假设您的意思是 N1 是 20):

    在我的情况下,如果 Num1 为 10,则 Num2 不能为 1 - 如果为 1,则失败,如果 Num2 为 20,则 Num2 不能为 2。

    到 Prolog 代码:

    do_function(N1, N2) :- N1 is 10, N2 \= 1.
    do_function(N1, N2) :- N1 is 20, N2 \= 2.
    

    或:

    do_function(10, N2) :- N2 \= 1.
    do_function(20, N2) :- N2 \= 2.
    

    【讨论】:

    • =\=/2(算术表达式比较)在这里比\=/2(术语统一)更可取。但是您的解决方案并未涵盖N1 既不是10 也不是20 的情况。
    • 问题不在于通用解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2010-09-07
    相关资源
    最近更新 更多