Prolog中是不是可以接受具有可变数量的谓词?
Posted
技术标签:
【中文标题】Prolog中是不是可以接受具有可变数量的谓词?【英文标题】: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(??) =.. [??]
我真的不知道这是否可能..
【问题讨论】:
【参考方案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)
)。以上是关于Prolog中是不是可以接受具有可变数量的谓词?的主要内容,如果未能解决你的问题,请参考以下文章