我开始学习Prolog之后的Prolog 编程:使用ISO标准.在介绍到,他们所作的断言语言的7页:"在序言答案没有被用来指没有与问题相结合,以记住,这是非常重要的.没有是不一样的错误." 那么为什么SWI-Prolog使用false和true语句代替yes或no?
我刚学序言和我有困难的时候理解为什么,我在"是/否"的结局进行结果查询.这是我的KB:
male(albert).
male(bob).
male(bill).
male(carl).
male(charlie).
male(dan).
male(edward).
female(alice).
female(betsy).
female(diana).
parent(albert, bob).
parent(albert, betsy).
parent(albert, bill).
parent(alice, bob).
parent(alice, betsy).
parent(alice, bill).
parent(bob, carl).
parent(bob, Charlie).
Run Code Online (Sandbox Code Playgroud)
然后我执行以下查询:
?-female(X).
Run Code Online (Sandbox Code Playgroud)
返回:
X = alice ? ;
X = betsy ? ;
X = diana
yes
Run Code Online (Sandbox Code Playgroud)
当我查询时:
?-parent(X, bob).
Run Code Online (Sandbox Code Playgroud)
我回来了:
X = albert ?;
X = alice ?;
no
Run Code Online (Sandbox Code Playgroud)
为什么一个导致'是',另一个导致'否'?
我很难弄清楚统一是按什么顺序完成的。我有以下查询:
[X, like | Z] = [I, Y, Prolog, language].
Run Code Online (Sandbox Code Playgroud)
这给了我以下结果:
X = I,
Z = [Prolog, language],
Y = like.
Run Code Online (Sandbox Code Playgroud)
然而,我期待的是:
X = I,
Y = like,
Z = [Prolog, language].
Run Code Online (Sandbox Code Playgroud)
Prolog 统一术语是否有任何特定顺序?
编辑:
我有一种感觉,Prologan atom with a variable将a variable with an atom. 是这样吗?
?- length(L,25).
L = [_G245, _G248, _G251, _G254, _G257, _G260, _G263, _G266, _G
269|...].
Run Code Online (Sandbox Code Playgroud)
如果我在长度谓词后面使用write(L),则解释器将列表打印两次,一次展开而另一次不展开.
这听起来很愚蠢,但是让我说我的谓词最大/ 2返回列表中最大的元素...输出应该如下所示:
?- largest([1,2,3,4,5], X).
X = 5.
false.
Run Code Online (Sandbox Code Playgroud)
我实现了最大,它的工作方式与上面类似,但不输出"false".我怎么做它所以它也输出这个"假".值?这是一个烦人的任务,我必须完成.:(
我是Prolog的新手,我只是在想,为什么这个规则在一个真实之后给我错误的结果.
likes(1,banana).
likes(1,mango).
test :- likes(1,banana),likes(1,mango).
?- test.
true;
false.
Run Code Online (Sandbox Code Playgroud)
我想知道这种错误背后的原因.
我是SWI-Prolog的初学者(但是有Borland Prolog的经验),并且对于以下测试代码,我遇到了奇怪的行为:
test(10).
test(1).
Run Code Online (Sandbox Code Playgroud)
预计查询?-test(A)将获得2个解决方案,例如A = 10; A = 1。但是,只有A = 10产生。我在这里不使用切割。也许SWI-Prolog中默认关闭了回溯功能?
提前致谢
我想了解为什么与之交互swipl似乎不一致.
这是一个典型的例子.假设我查阅了包含以下定义的知识库:
acc_max([H|T], A, Max) :- H > A, acc_max(T, H, Max).
acc_max([H|T], A, Max) :- H =< A, acc_max(T, A, Max).
acc_max([], A, A).
max([H|T], Max) :- acc_max(T, H, Max).
Run Code Online (Sandbox Code Playgroud)
下面我显示max([0, 1, 2], X).在输入提示符后我的屏幕显示的内容,并点击Enter:
?- max([0, 1, 2], X).
X = 2 ?
Run Code Online (Sandbox Code Playgroud)
(?表示光标的位置.)
请特别注意,解释器的下一个提示尚未出现.
这是我输入后屏幕的样子;:
?- max([0, 1, 2], X).
X = 2 ;
false.
?- ?
Run Code Online (Sandbox Code Playgroud)
现在我终于得到了翻译的提示.
相比之下,下面我显示了max([2, 0, 1], X).在输入提示符后我的屏幕显示的内容,并点击Enter:
?- max([2, …Run Code Online (Sandbox Code Playgroud) 如何将listing/0SWI-Prolog REPL 的输出写入文件?
?- listing > file.txt.
Run Code Online (Sandbox Code Playgroud) 我在知识库中有这一行:
height(Hipot,Y) :- Y is sin(pi/6)*Hipot.
Run Code Online (Sandbox Code Playgroud)
它计算一个直角三角形的导管之一。
当向 Prolog 询问 的值时Y,即 cathetus,我得到一个不准确的数字:
?- height(1,Y).
Y = 0.49999999999999994.
Run Code Online (Sandbox Code Playgroud)
但实际值是1/2,所以应该输出0.5。我想不准确是因为使用了pi,但我想继续使用它,所以我如何舍入Y到 0.5?
使用prolog(swipl)时遇到问题,在终端中输入swipl后,当我按上,下,左键时,会显示类似'^ [[A ^ [[B ^ [[D ^ [[C]然后就在我的键盘上 有人可以解释为什么吗?以及如何解决。提前致谢!