我是Prolog的初学者,我想知道如何使用ground/1
。
目前我有这段代码:
intertwine([], [], []).
intertwine([E|Es], Fs, [E|Gs]) :- intertwine(Es, Fs, Gs).
intertwine(Es, [F|Fs], [F|Gs]) :- intertwine(Es, Fs, Gs).
但是当我尝试在shell中调用它时:
intertwine([1,2],X,[1,a,2,b]).
我得到了正确答案X=[a,b]
,但查询没有结束,好像它认为还有另一个答案。所以,我按“;”我得到“假”作为输出。我在另一个问题的答案中读到,我应该使用ground/1
检查第三个列表是否已经完全实例化以处理该案例。
事实上,作为一个完整的初学者,我不知道如何做到这一点。那么是否有人能够向我解释基础如何工作以及如何使用它来检查特定参数的实例化并使用它来检查不存在的答案?
答案 0 :(得分:2)
这种行为完全没问题。有时,Prolog能够发现没有进一步的解决方案,有时也没有。细节对所描述的内容没有任何影响。考虑:
?- X = 1 ; 2 = 3.
X = 1 ;
false.
在这里,我们很明显2 = 3
不是解决方案,Prolog仍要求我们继续。
答案 1 :(得分:0)
像假说的那样,这种行为确实没问题。 ground/1
谓词实际上与该问题无关。
如果我的问题正确,没有代码检查不存在的答案?
Cut可以在这里提供帮助。
intertwine([], [], []).
intertwine([E|Es], Fs, [E|Gs]) :- intertwine(Es, Fs, Gs), !.
intertwine(Es, [F|Fs], [F|Gs]) :- intertwine(Es, Fs, Gs), !.
所以你得到了你的答案。
?- intertwine([1,2],X,[1,a,2,b]).
X = [a, b].
?-
答案 2 :(得分:0)
要检查参数的实例,而不是ground/1,您应该考虑使用var/1(或相关的nonvar / 1)。 var / 1它是基本的 metapredicate ,它扩展了Prolog的功能,超越了所谓的纯语言子集。它允许推理程序本身,根据变量等基本实体的“状态”选择适当的行为。
从实际编程POV(非常)简单地使用这些metapredicate,允许为特定参数实现默认值:例如
%% gunzip(+Gz, ?Ex) is det.
%
% uncompress the file Gz in Ex
% if Ex is var strip .gz extension
%
gunzip(Gz, Ex) :-
( nonvar(Ex)
-> true
; atom_codes(Gz, Cs),
phrase(string(ExCs), Cs, ".gz"),
atom_codes(Ex, ExCs)
),
gzopen(Gz, read, I, [type(binary)]),
setup_call_cleanup(open(Ex, write, O, [type(binary)]),
copy_stream_data(I, O),
( close(I), close(O) )
).
如果我们调用gunzip('file.gz',F),F得到实例(希望),其名称为膨胀数据。