【问题标题】:Is a predicate with variable arity acceptable in Prolog?Prolog中是否可以接受具有可变数量的谓词?
【发布时间】:2012-01-08 05:20:33
【问题描述】:

Prolog 中是否可以有一个“可变数量谓词”?

我的意思是这样的:

my_predicate( [a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)

开始时初始列表的数量未知?

使用 univ 运算符 ( =.. ) 可以将其与术语列表统一起来,并像其他所有列表一样遍历它。但是目标怎么写呢?

my_predicate(??) =.. [??]

我真的不知道这是否可能..

【问题讨论】:

    标签: prolog logic


    【解决方案1】:

    您可以定义具有相同名称的不同参数的谓词,但它们将是不同的谓词。

    foo(1).
    foo(2,1).
    
    ?-foo(2).
    false
    

    我的建议是改变编码;有一个初始列表列表,而不是多个初始列表。
    另一种解决方案是为所有可能数量的参数编写谓词(或动态生成它们)。

    【讨论】:

    • 我想到了,对我来说似乎更合理..但我没有写指令。
    • 我认为文本是错误的......它的字面意思是“让我们在第一个参数处有一个带有列表列表的谓词......”。我猜我上面写的谓词文本是完全错误的。可能是作者搞错了
    【解决方案2】:

    正如@thanosQR 建议的那样,最好将您的表示更改为某个列表。

    但是,在某些情况下 - 非常罕见但仍然 - 您想要为许多不同的 arities 定义谓词。在这种非常罕见的情况下,您可以手动定义这样的谓词。也就是说,手动为每个参数。当然,您只会定义几种情况。例如,请参阅library(lambda)

    【讨论】:

      【解决方案3】:

      您总是可以上一级 :) 很多年前,我在 Turbo Prolog 中看到了 ANSI prolog 解释器的实现。想法非常简单,将所有用户空间事实和规则包含在一个由类似断言/撤回的操作支持的事实中。

      考虑将所有目标包含在另一个 compose 中:

      target(my_predicate( [a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)) :- RESULT=[a], N=1.
      target(H) :- H =.. [my_predicate|_].
      target(using_my_predicate(X, Y)) :- target(my_predicate(X,1,Y)).
      

      一些序言(至少是 YAP)有指令来声明未知目标的处理程序:

      :- module(sumtest).
      
      target(sum(0)).
      target(H) :-
          H =.. [sum, S, X|XS],
          H1 =.. [sum, S1|XS],
          H1,
          S is (S1+X).
      
      target(sumtest:G):- target(G). % HACK: strip-off module
      
      :- unknown(_, target(_)).
      
      test:-
          sum(X,1), write(X), nl,
          sum(Y,2,3), write(Y), nl,
          sum(Z,3,4,2), write(Z), nl,
          target(sum(X1,1)), write(X1), nl,
          target(sum(Y1,2,3)), write(Y1), nl,
          target(sum(Z1,3,4,2)), write(Z1), nl.
      
      
      :- test, halt.
      % % yap -l sumtest.pl
      % YAP 6.2.0 (amd64): Thu Oct 21 10:31:27 EEST 2010
      % MYDDAS version MYDDAS-0.9.1
      % 1
      % 5
      % 9
      % 1
      % 5
      % 9
      %  % YAP execution halted
      

      【讨论】:

      • 感谢您的解决方案,尽管目前我无法做到 :)
      • 有两种方法可以使用该解决方案。一种是使用指令为未知目标指定处理程序。其他的总是将目标头部包裹在附加层中(target(sum(X)) insted of just sum(X))。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      相关资源
      最近更新 更多