相关疑难解决方法(0)

Prolog的逻辑"不"是什么?

我面临的问题有点微不足道.我想在Prolog中使用逻辑,但似乎not/1不是我想要的东西:

course(ai).
course(pl).
course(os).

have(X,Y) :- course(X),course(Y),not(X = Y).
Run Code Online (Sandbox Code Playgroud)

我查询:

have(X,Y), write(X-Y), nl , fail.
Run Code Online (Sandbox Code Playgroud)

我没有得到我想要的结果:(

prolog prolog-dif

35
推荐指数
4
解决办法
8万
查看次数

如何在ISO Prolog中定义(和命名)相应的安全术语比较谓词?

标准术语顺序(ISO/IEC 13211-1 7.2术语顺序)是在所有术语(包括变量)上定义的.虽然有很好的用途 - 想想实现setof/3,但这使得许多其他清洁和逻辑用途的内置插件在8.4 Term比较中声明性的噩梦与imps(命令式构造的简短形式)四处都有.8.4术语比较功能:

8.4术语比较

8.4.1(@ = <)/ 2,(==)/ 2,(\ ==)/ 2,(@ <)/ 2,(@>)/ 2,(@> =)/ 2.
8.4.2比较/ 3.
8.4.3 sort/2.
8.4.4 keysort/2.

举个例子,考虑一下:

?- X @< a.
true.
Run Code Online (Sandbox Code Playgroud)

这成功了,因为

7.2期限订单

命令term_precedes(3.181)定义
术语X术语是否在术语之前Y.

如果XY是相同的术语,则X term_precedes Y
Y term_precedes X都是假的.

如果XY有不同的类型:Xterm_precedes Y当且仅当该
类型X先于类型Y按以下顺序:
variablefloating point先于integer
先 …

sorting prolog iso-prolog prolog-dif

32
推荐指数
4
解决办法
934
查看次数

使用\ ==/2或dif/2

如果我想确保两个变量不实例化到同一个术语,那么首选方法是什么?

假设我需要在图中找到有向边,并且节点不能有自己的边:

node(a, x, y). node(b, z, x). node(c, y, y).
Run Code Online (Sandbox Code Playgroud)

(这里的边是 - > c,b - > a,但不是 c - > c)

以下作品:

edge(A, B) :- node(A, _, X), node(B, X, _), A \== B.
Run Code Online (Sandbox Code Playgroud)

这也有效[swi-prolog]:

edge(A, B) :- dif(A, B), node(A, _, X), node(B, X, _).
Run Code Online (Sandbox Code Playgroud)

这显然不起作用(因为A和B都没有被实例化?):

edge(A, B) :- A \== B, node(A, _, X), node(B, X, _).
Run Code Online (Sandbox Code Playgroud)

我想我的第一个解决方案的问题是,使用更复杂的node谓词,在edge失败之前可能会发生许多不必要的统一.在dif另一方面,是在图书馆,这表明它并不意味着在这种简单的情况下使用(虽然它,我似乎在寻找精确的功能).

prolog prolog-dif logical-purity

16
推荐指数
3
解决办法
2002
查看次数

如何在序言中正确表达不等式?

TL;DR: sibling(a,X)成功回答X = a,但sibling(a,a)失败。


我有以下 Prolog 文件:

children(a, c).
children(a, d).
children(b, c).
children(b, d).

sibling(X, Y) :-
   X \== Y, A \== B,
   children(X, A), children(X, B),
   children(Y, A), children(Y, B).
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很清楚,如果他们的父母相同,那么两个人就是兄弟姐妹。此外,一个人不是他们自己的兄弟姐妹。

但是当我尝试在 GNU Prolog 上运行一些查询时,我得到了一些奇怪的结果:

| ?- sibling(a, b).

true ? a

true

true

yes
Run Code Online (Sandbox Code Playgroud)

这是预期的行为。a并且b是兄弟姐妹。有三个结果,这有点奇怪,但我认为 Prolog 是绑定A = c, B = dA = d, B = c.

| ?- sibling(a, a).

no
Run Code Online (Sandbox Code Playgroud)

我认为这意味着a …

prolog prolog-dif

5
推荐指数
1
解决办法
381
查看次数

CLPB 的不良特性

library(clpb)目前可用于 SICStus(原始版本)和 SWI(通过 mat)。让我很快进入本质:

?- X = 1+1, sat(X), X = 1+1.
X = 1+1.

?-          sat(X), X = 1+1.
false.
Run Code Online (Sandbox Code Playgroud)

所以这是一个类似的问题,因为它存在于library(clpfd).

遇到这种情况怎么办?

更新:在library(clpfd)垫子中,现在有用# /1于此目的的函子。理想情况下,加上操作符声明op(150,fx,#),我们现在可以写:

?- X = 1+1, #X #= Y.
ERROR: Type error: `integer' expected, found `1+1' (a compound)
Run Code Online (Sandbox Code Playgroud)

为了确保完全代数性质,必须声明:

:- set_prolog_flag(clpfd_monotonic, true).
Run Code Online (Sandbox Code Playgroud)

现在,不明确的变量(因此,只能是整数或表达式)会产生实例化错误:

?-  1 + 1 #= Y.
ERROR: Arguments are not sufficiently instantiated
?- 1 + 1 #= #Y.
Y = 2.
Run Code Online (Sandbox Code Playgroud)

prolog clpb

5
推荐指数
0
解决办法
214
查看次数

Prolog no_duplicate函数

我正在尝试编写一个简单的过程来检查列表是否有任何重复.这是我到目前为止所尝试的:

% returns true if the list has no duplicate items.
no_duplicates([X|XS]) :- member(X,XS) -> false ; no_duplicates(XS).
no_duplicates([]) :- true. 
Run Code Online (Sandbox Code Playgroud)

如果我试试no_duplicates([1,2,3,3]).它说的是真的.为什么是这样?我可能在这里误解了Prolog,但任何帮助都表示赞赏.

prolog prolog-dif

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

我父亲的侄子在prolog

我在prolog中编程一个家庭,我在使用nephew实现时遇到了麻烦.当我问埃里克是否是阿尔贝托的侄子时,它返回真实,因为它应该返回假,因为阿尔贝托是埃里克的父亲,然而,它确实适用于所有其他应该是真实的情况.如果有人能帮助我,我将非常感激.我的代码:

man(beto).
man(fransisco).
man(alberto).
man(jaime).
man(manolo).
man(nolo).
man(lito).
man(manuel).
man(erick).
man(jesu).
man(jesus).
woman(emi).
woman(harumi).
woman(haru).
woman(yuneisi).
woman(yasmeli).
woman(mioara).
woman(elia).
woman(iza).
woman(alice).
woman(ofelia).
woman(arlet).
parent(manuel, alberto).
parent(ofelia, alberto).
parent(manuel, jaime).
parent(ofelia, jaime).
parent(manuel, manolo).
parent(ofelia, manolo).
parent(alberto, erick).
parent(alberto, beto).
parent(alberto, fransisco).
parent(emi, erick).
parent(emi, beto).
parent(manolo, nolo).
parent(manolo, arlet).
parent(nolo, lito).
parent(iza, lito).
parent(mioara, yuneisi).
parent(mioara, yasmeli).
parent(jaime, yuneisi).
parent(jaime, yasmeli).
parent(jesus_padre, jesu)
parent(jesus_padre, alice).
parent(jesus_padre, haru).
parent(harumi, haru).
parent(harumi, jesu).
parent(harumi, alice).
father(X,Y) :- parent(X,Y), man(X).
mother(X,Y) :- parent(X,Y), …
Run Code Online (Sandbox Code Playgroud)

logic prolog

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

Prolog中的alldifferent/1谓词

allsame([]).
allsame([X]).
allsame([X,X|Z]) :-
   allsame([X|Z]).
Run Code Online (Sandbox Code Playgroud)

如何更改以获得下面的结果?

alldifferent(L): The elements in L are all different.

?- alldifferent([a, b, b, c, d]).
false
?- alldifferent([a, b, c, d, e]).
true
Run Code Online (Sandbox Code Playgroud)

prolog dcg

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

标签 统计

prolog ×8

prolog-dif ×5

clpb ×1

dcg ×1

iso-prolog ×1

logic ×1

logical-purity ×1

sorting ×1