我有一个对列表,并希望找到具有相应第一个值的元素.
?- findconn1(9, [(9,[23,33]),(42,[21,322])], R).
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,我希望得到的结果是(9,[23,23])
在R
.
代码是
findconn(X, [], R).
findconn(X, [(H,T)|Y], R) :-
member(X, H),
findConn(X, Y),
append(T, T, R).
Run Code Online (Sandbox Code Playgroud)
false
尽管元素存在,它总是返回.还有其他方法可以返回,因为我对Prolog很新.
我是Prolog的新手,最近开始学习它,使用了很棒的书,现在学习Prolog!.有一些我不完全理解的东西,这真的让我烦恼.其中一个练习题是
我们有以下知识库和谓词:
child(anne,bridget).
child(bridget,caroline).
child(caroline,donna).
child(donna,emily).
descend(X,Y) :- child(X,Y).
descend(X,Y) :- child(X,Z),
descend(Z,Y).
Run Code Online (Sandbox Code Playgroud)
如果我们将谓词更改为以下内容会发生什么:
descend(X,Y) :- child(X,Y).
descend(X,Y) :- descend(X,Z),
descend(Z,Y).
Run Code Online (Sandbox Code Playgroud)
我知道这会导致对错误情况的无限递归,但我无法完全理解为什么.
如果我理解正确,在上面的第一种情况下,如果给出错误的查询child(X,Z)
会耗尽其所有选项,试图将多个元素统一到Z然后失败,回溯到之前的X然后尝试再次选择Z以满足子项(X,Z) ).(如果我错了,请纠正我).
我不确定为什么下降谓词的第二个定义不会发生同样的情况.
我需要在列表列表中找到组合。例如,给出以下列表,
List = [[1, 2], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
这些应该是输出,
Comb = [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3]]
Run Code Online (Sandbox Code Playgroud)
另一个例子:
List = [[1,2],[1,2],[1,2,3]]
Comb = [[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3]....etc]
Run Code Online (Sandbox Code Playgroud)
我知道如何为具有两个子列表的列表执行此操作,但它需要适用于任意数量的子列表。
我是 Prolog 的新手,请帮忙。
在OCaml的手册第八章“语言扩展”描述“在线记录”(8.17) :
现在可以使用与记录相同的语法定义和类型构造函数的参数。允许可变和多态字段。支持 GADT 语法。可以在单个字段上指定属性。[...]
我正在寻找多态变体:
# type a = B of {x:int; mutable y:int} ;;
type a = B of { x : int; mutable y : int; }
# type b = `A of {u:int; mutable v:int} ;;
Line 1, characters 9-10:
Error: Syntax error
Run Code Online (Sandbox Code Playgroud)
但这不起作用,所以现在我使用显式辅助记录类型代替......据我现在理解,这既需要更多内存,也有点慢。
我也可以通过多态变体获得这个很酷的功能吗?
一方面:
$ sicstus SICStus 4.6.0 (x86_64-linux-glibc2.17): Mon Apr 6 09:23:37 PDT 2020 [...] | ?- \+ (!,false) ; X = 1。 是的
... 另一方面 ...
$ gprolog GNU Prolog 1.4.5(64 位) [...] | ?- \+ (!,false) ; X = 1。 真的 ?; X = 1 是的
……另一方面:
$交换 欢迎使用 SWI-Prolog(线程,64 位,版本 8.2.2) [...] 1 ?- \+ (!,false) ; X = 1。 真; X = 1。
令人困惑,不是吗?请帮忙!
我正在编写一个 Prolog 系统,并且使用多态变体来表示 Prolog 术语。
特别是,我使用多态变体(而不是常规变体),因此我可以进行子类型化,同时确保 OCaml 对子类型的匹配进行出色的详尽检查。
到目前为止,一切都很好!
我曾多次阅读过有关 GADT 的内容(在 Discuss.ocaml.org 和 realworldocaml.org 上)。对我来说,GADT 似乎提供了类似的功能,但内存占用更小:具有多个参数的情况的多态变体需要一个额外的指针,而常规变体不需要。
到目前为止,我还没有能够成功使用 GADT,所以这是我的问题:
是否有一种简单、直接的方法将使用多态变体的代码转换为 GADT?在一般情况下这甚至可能吗?
先感谢您!
以这个程序为例。它使用延迟目标
room(green).
room(blue).
room(red).
room(white).
location(jimmy,red).
location(ricky,blue).
location(cindy,green).
% "Is a certain room unoccupied?"
not_occupied(Room) :-
nonvar(Room),
assertion(room(Room)),
\+ location(_Person,Room).
% If no specific "Room" has been given, the negated goal is
% delayed until the "Room" has been instantiated.
not_occupied(Room) :-
var(Room),
!,
when(
ground(Room),
(\+ location(_Person,Room))
).
Run Code Online (Sandbox Code Playgroud)
如果我现在问
?- not_occupied(R).
Run Code Online (Sandbox Code Playgroud)
然后 Prolog 成功并输出一个残差目标
?- not_occupied(R).
when(ground(R),\+location(_7676,R)).
Run Code Online (Sandbox Code Playgroud)
实际上,它并没有真正成功。它乐观地成功(因为为了不停止计算,它必须成功)但实际的逻辑成功取决于剩余目标的实际成功。
如何以编程方式找出子目标是否成功实现剩余目标?(然后我该怎么办?) 方法是什么?
聚苯乙烯
具有辅助 Prolog 真值可能是一个不错的 Prolog 扩展,因为 atrue+
表示“在剩余目标成功的情况下成功”。这实际上似乎有一定的必要性:
在 SWI-Prolog 中,采用这个固有的模糊目标:
do :- not_occupied(_). …
Run Code Online (Sandbox Code Playgroud) 如何计算列表的长度
?- size_sub([[b,a,g], [9,3,7,4], [6]], X).
X = [3, 4, 1].
?- size_sub([[c,g,e,w], [7]], X).
X = [4, 1].
?- size_sub([], X).
X = [].
Run Code Online (Sandbox Code Playgroud) 我想访问列表排列并将其作为参数传递给其他函数.
这是排列代码:
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :-
takeout(X,R,S),
write(S).
perm([X|Y],Z) :-
perm(Y,W),
takeout(X,Z,W).
perm([],[]).
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚这出错的地方.请注意,我对Prolog很新,我确定我错过了一些东西 - 不知道那可能是什么.有人可以帮帮我吗?
谢谢,这是我的代码:
printSentence([]).
printSentence([W|[]]) :-
write(W),
write('.'),
nl.
printSentence([W|R]) :-
write(W),
write(' '),
printSentence(R).
transform([], Result).
transform([Word|Rest], Result) :-
replace(Word, Replacement),
append(Result, Replacement, NewResult),
transform(Rest, NewResult).
replace(my, your).
replace(i, you).
replace(you, me).
replace(am, are).
replace(Word, Word).
test :-
X = [you, are, my, only, hope],
transform(X, Result),
printSentence(Result).
Run Code Online (Sandbox Code Playgroud) prolog ×8
list ×4
ocaml ×2
gadt ×1
iso-prolog ×1
performance ×1
permutation ×1
prolog-cut ×1
prolog-dif ×1
recursion ×1
subtyping ×1