我使用Teyjus在Lambda Prolog中进行编程。我有一个简单的列表生成器:
type islist int -> list X -> o.
islist N nil
:- N >= 0.
islist N (H::T)
:- N >= 0,
M is N - 1,
islist M T.
我需要创建一个谓词,返回一个由islist在一定范围内生成的所有列表组成的列表。
我想继续进行失败驱动的循环。目前,我只能打印以下代码生成的列表:
type loop int -> o.
loo
我对Prolog有点陌生。我正在尝试编写一个函数子集( Set,Subset)来确定子集是否是Set (duh)的子集。另外,如果第二个参数没有实例化,它应该输出每个可能的子集。现在,当两个参数都实例化时,它可以工作,但当我试图输出所有子集时,它遇到了成员/2的问题。例如:
?- subset([1,2,3], S).
S = [];
S = [1];
S = [1, 1];
S = [1, 1, 1];
...
下面是我的代码:
% subset/2
% subset(Set, Subset) iff Subset is a subset of Set
subset(_, []).
subs
在ic库中,可以创建一个具有如下域的变量:
X #:: [1..10] % Variable X with domain the integers from 1 to 10.
还可以使用相同的域创建两个变量,如下所示:
[X,Y] #:: [1..10]
如何创建两个以整数列表作为域的变量?
更具体地说,如果我有一组整数S,我如何使每个变量都有一个S的子集( P1,P2)来确保P1和P2没有公共元素,以及P1+ P2 = S?
考虑到在Prolog中创建数据库,使用列表显然是无效的。所以我想知道的是,是否有可能通过索引来访问元素,以及从理论上讲,如何创建一个大型数据库。
我感兴趣的另一个主题是如何实现这样一个简单的任务:
假设我们有两个数组
A 1,3,5,2,6,4和B "a","b","d","e","c","f“
目标是将字母绑定到数字,然后对两个数组进行排序,以获得
A 1,2,3,4,5,6和B "a","e","b","f","d",
给定一个列表(如[1,2,3,7,2,5,8,9,3,4] ),我将如何提取列表中的序列?
序列被定义为有序列表(通常我会说n元组,但我在prolog中被告知,元组被称为序列)。因此,我们希望在下一个元素比前一个元素更小的点上削减列表。
因此,对于列表[1,2,3,7,2,5,8,9,3,4],它应该返回:
[ [1,2,3,7], [2,5,8,9], [3,4] ] %ie we have cut the list at position 4 & 8.
对于本练习,您不能使用构造;或->
事先非常感谢!
示例的结果是:
eg1。
?-function([1,2,3,7,2,
我使用的是子项,这是导致内容是不允许在prolog问题。
<subant target="main" genericantfile="build.xml">
<fileset dir = "." />
</subant>
错误:
The following error occurred while executing this line:
pattern.py:1: Content is not allowed in prolog.
请注意,我在这些文件夹中有不同的文件,例如py
我想要做一个谓词,返回一个数字除数器的列表。例: 72 = 2*2*2*3*3。
prdel(A,[],_):-
A is 1.
prdel(P,[D|L],D):-
0 is mod(P,D),
P1 is P/D,
prdel(P1,L,D).
prdel(P,L,D):-
D1 is D+1,
prdel(P,L,D1).
这可以工作,并返回正确的列表。问题在于,如果我按空格,它不会停止,而是一次又一次地返回相同的列表(对不起,当您使用相同的谓词得到不同的答案时,我不知道英语中的那个词)。我希望它在第一次之后停止。
我想在prolog中实现以下问题:
给定L1=[1,2,3,4] and L2=[2,3,4]
调用一个名为remove_list( L1,L2,L)的函数将从L1中删除L2。
所以L是1,但是如果第二个列表的元素与L1的顺序不同,或者更准确地说,第二个元素不是第一个列表的子集,它不会删除任何东西。
说L1=[1,2,3,4,5] and L2=[2,3,6] or L2=[2,6] or L2=[4,3,2] will result L=[1,2,3,4,5]
任何帮助都将不胜感激。提前感谢