prolog - (>)/2 的参数 2 中的实例化错误
问题描述
所以我试图定义自然数到目前为止我这样做了:
1 nat(0). % 0 zero is a natural, can be a stoping case
2 nat(X):- 0>X , !,fail. %if is less then zero then its not a natural.
3 nat(X):- nat(Z), X is Z+1. %if its bigger than zero do recursively for the number-1
当我这样做时,它给了我“(>)/2 的参数 2 中的实例化错误”,因此他无法在第 2 行中实例化 X,但如果取出失败,他会执行比较 (>) 并且实例化没有问题X,那他为什么抱怨我失败了?
解决方案
如果你想生成自然数,你可以不使用切割或fail/0
控制结构来做到这一点。例如:
nat(Nat) :-
next_integer(0, Nat).
next_integer(I, I).
next_integer(I, K) :-
J is I + 1,
next_integer(J, K).
示例调用:
| ?- nat(Nat).
Nat = 0 ? ;
Nat = 1 ? ;
Nat = 2 ? ;
Nat = 3 ?
...
但是,如果您想测试一个术语是否为自然数,则此谓词将不起作用。例如,以下调用将导致大多数 Prolog 系统中的堆栈溢出(因为我们不能通过从零递增来生成负整数):
| ?- nat(-3).
如果您使用的是提供 CLP(FD) 库的 Prolog 系统,则可以使用更好的定义:
nat(Nat) :-
Nat #>= 0,
next_integer(0, Nat).
next_integer(I, I).
next_integer(I, K) :-
J is I + 1,
next_integer(J, K).
然后使用相同的谓词进行生成和测试。例如,使用 SWI-Prolog 和library(clpfd)
:
?- nat(Nat).
Nat = 0 ;
Nat = 1 ;
Nat = 2 ;
Nat = 3
...
?- nat(-3).
false.
如果不使用约束库,您将需要编写如下内容:
nat(Nat) :-
( var(Nat) ->
next_integer(0, Nat)
; integer(Nat), Nat >= 0
).
推荐阅读
- r - 获取向量中唯一值的索引
- kubernetes - 使用 OIDC 的 Kubernetes 服务帐户角色
- jenkins - Jenkins 可以运行一些代码还是只调度外部程序?
- wix - WiX:如何显示功能元素的“描述”文本?
- android - 无法在以下项目变体之间进行选择:features:myDynamicFeatureModule:
- java - 触摸功能在 JDK1.8 的 Ubuntu 上不起作用
- python - 如何连接每个形状的两个元组
:(100,1) 到一个元组形状 :(100,2) 使用 python? - excel - 在 VBA ArrayList 中搜索元素
- python - Tensorflow:如何优化训练模型的大小?
- python - Python multipart/form-data 发布请求