- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 prolog 程序来确定一个列表是否是另一个列表的排列。输入的形式为 perm(L,M)
,当且仅当列表 L
是列表 M
的排列时,它才为真。
这是我的 AI 类,所以我不能只使用 gprolog 已经提供的漂亮的小 permutation
谓词。我们的教授指出 member
谓词可能很有用,但我的任何涉及它的想法似乎都需要非常棘手且不那么声明的东西(我假设有一种方法可以解决这不会太高级,因为该类是 prolog 的新类。)
无论如何,一种检查方法应该是查看 L
和 M
大小相同,每个 L
元素都在 M
,每个 M
元素都在 L
中(有 member
的用法!)。但是,对于 [2,2,4]
和 [4,4,2]
等情况,这还不够。
另一种方法可能是确保每个元素的相同计数在相反的列表中,但我对序言的印象是任何类型的变量'内存'都是相当困难的业务(事实上,似乎示例程序我看到执行排序等根本不是真正的操纵数据;它们只是“假设地”重新排列事物,然后告诉你是或否……?)
从心理上讲,人们可以对两个列表进行排序并并排检查元素,但是,在许多其他的思考方式中,这似乎有点太面向对象了……
有什么提示吗?我最大的麻烦似乎是(如前所述)这样一个事实,即进行“操作”似乎更像是询问它们并希望事情保持足够长的时间以达到您想要的目的。
**更新:gprolog 确实提供了一个delete
功能,但它伴随着我所期待的与声明相关的麻烦,给出这样的尝试:
perm([LH|LT], R) :- member(LH,R), delete([LH|LT],LH,R), perm(LT,R).
在手册中,delete 是这样定义的:“delete(List1, Element, List2) 删除所有出现在 List1 中的 Element 以提供 List2。需要严格的术语相等性,cf. (==)/2”
执行:
{trace}
| ?- perm([1,2,3],[3,1,2]).
1 1 Call: perm([1,2,3],[3,1,2]) ?
2 2 Call: member(1,[3,1,2]) ?
2 2 Exit: member(1,[3,1,2]) ?
3 2 Call: delete([1,2,3],1,[3,1,2]) ?
3 2 Fail: delete([1,2,3],1,[3,1,2]) ?
2 2 Redo: member(1,[3,1,2]) ?
2 2 Fail: member(1,[3,1,2]) ?
1 1 Fail: perm([1,2,3],[3,1,2]) ?
(1 ms) no
**更新 2:我想我可能已经明白了!这有点冗长,但我已经测试了很多情况,还没有发现一个坏的。如果有人看到重大问题,请指出:
perm([],[]).
perm([LH|LT],R) :- length([LH|LT],A), length(R,B), A == B, member(LH,R), select(LH,[LH|LT],X), select(LH,R,Y), perm_recurse(X, Y), !.
perm_recurse([],X). %If we get here, all elements successfully matched
perm_recurse([LH|LT],R) :- member(LH,R), select(LH,[LH|LT],X), select(LH,R,Y), perm_recurse(X, Y), !.
我喜欢 cut 运算符..
最佳答案
定义更通用的谓词并以狭义的方式使用它总是好的:
perm(X,L):- mselect(X,L,[]).
mselect([A|B],L,R):- select(A,L,M), mselect(B,M,R).
mselect([],L,L).
member
不好,因为它保留第二个列表不变。 delete
也不好,因为它删除了多重性。
不过您可以使用append
。 :) 它也结合了拾取和删除:
perm([A|B],L):- length(L,N), between(0,N,I),length(X,I),
append(X,[A],Y), append(Y,Z,L),
append(X,Z,M), perm(B,M).
perm([],[]).
关于prolog - gprolog - 确定一个列表是否是另一个列表的排列的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474400/
我正在尝试编写一个 prolog 程序来确定一个列表是否是另一个列表的排列。输入的形式为 perm(L,M),当且仅当列表 L 是列表 M 的排列时,它才为真。 这是我的 AI 类,所以我不能只使用
我正在尝试编写一个 prolog 程序来确定一个列表是否是另一个列表的排列。输入的形式为 perm(L,M),当且仅当列表 L 是列表 M 的排列时,它才为真。 这是我的 AI 类,所以我不能只使用
我有一个整数列表,我需要从列表中找到升序整数的最长子集。例如:[1,2,5,3,6,7,4] - 最长的子集应该是 SS = [1,2,3,6,7]。 谁能至少告诉我实现它的主要指南。 最佳答案 lo
我正在尝试使用 IO 重定向通过文本文件向 gprolog 发送一组查询。文件 input.txt 看起来是这样的: consult(rules). dog(X). halt. 每当我在命令行通过 g
我在 Prolog 中有这个代码: dynamic(player_at/1). player_at(house). goto(X) :- retract(player_at(house)), asse
gprolog 中的最小/最大整数是多少?有没有办法在不使用“魔数(Magic Number)”的情况下引用这些数字? 最佳答案 我认为这些应该有效: current_prolog_flag(boun
以下来自top命令: size res 1127 *** 1 20 0 117M 2196K ttyin 0
在使用 gprolog 时,我经常遇到没有任何类型的行号或上下文的异常: uncaught exception: error(instantiation_error,(is)/2) 没有任何上下文。我
我正在阅读 Learn Prolog Now , 1.1.2 Knowledge Base 2 他们写了关于将 modus ponens 的使用链接在一起的内容。 KB2.pl 文件: listens
我在连接 C 和 Prolog 代码时处于有点不幸的位置。我们在 C 中有一些数据收集代码,在 Gnu-Prolog 中有一些分析代码。那么连接 C 和 gprolog 的最佳方法是什么?我目前正在尝
我正在尝试编写一个 gprolog 程序,根据 this 的一些“合理”背景来确认这一点。歌曲(听 here :-) ),当我查询grandpa(me, me)时会回答"is"(即,我确实是我自己的爷
我是一名优秀的程序员,十分优秀!