小编rep*_*eat的帖子

序言; 找到列表项

我有一个对列表,并希望找到具有相应第一个值的元素.

?- 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很新.

list prolog

4
推荐指数
1
解决办法
127
查看次数

用递归调用替换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) ).(如果我错了,请纠正我).

我不确定为什么下降谓词的第二个定义不会发生同样的情况.

recursion prolog

4
推荐指数
1
解决办法
203
查看次数

多个列表的组合 - Prolog

我需要在列表列表中找到组合。例如,给出以下列表,

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 的新手,请帮忙。

list prolog

4
推荐指数
1
解决办法
466
查看次数

多态变体中的内联记录?

手册第八章“语言扩展”描述“在线记录”(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)

但这不起作用,所以现在我使用显式辅助记录类型代替......据我现在理解,这既需要更多内存,也有点慢。

我也可以通过多态变体获得这个很酷的功能吗?

performance ocaml missing-features

4
推荐指数
1
解决办法
164
查看次数

!/0 是否应该穿过 (\+)/1 ?

一方面:

$ 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 iso-prolog prolog-cut

4
推荐指数
1
解决办法
54
查看次数

多态性变体 --> GADT?

我正在编写一个 Prolog 系统,并且使用多态变体来表示 Prolog 术语。

特别是,我使用多态变体(而不是常规变体),因此我可以进行子类型化,同时确保 OCaml 对子类型的匹配进行出色的详尽检查。

到目前为止,一切都很好!

我曾多次阅读过有关 GADT 的内容(在 Discuss.ocaml.org 和 realworldocaml.org 上)。对我来说,GADT 似乎提供了类似的功能,但内存占用更小:具有多个参数的情况的多态变体需要一个额外的指针,而常规变体不需要。

到目前为止,我还没有能够成功使用 GADT,所以这是我的问题:

是否有一种简单、直接的方法将使用多态变体的代码转换为 GADT?在一般情况下这甚至可能吗?

先感谢您!

ocaml gadt subtyping polymorphic-variants

4
推荐指数
1
解决办法
654
查看次数

Prolog中处理“剩余目标”的方法是什么?

以这个程序为例。它使用延迟目标

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)

prolog prolog-coroutining

4
推荐指数
1
解决办法
192
查看次数

Prolog长度列表

如何计算列表的长度

?- 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)

list prolog

3
推荐指数
2
解决办法
2万
查看次数

如何访问prolog中的列表排列?

我想访问列表排列并将其作为参数传递给其他函数.

这是排列代码:

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)

list permutation prolog prolog-dif

3
推荐指数
1
解决办法
1万
查看次数

转换句子会产生无限循环 - 但是如何?

我无法弄清楚这出错的地方.请注意,我对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 text-manipulation non-termination failure-slice

3
推荐指数
1
解决办法
305
查看次数