我面临的问题有点微不足道.我想在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)
我没有得到我想要的结果:(
标准术语顺序(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.如果
X且Y是相同的术语,则Xterm_precedesY
和Yterm_precedesX都是假的.如果
X和Y有不同的类型:Xterm_precedesY当且仅当该
类型X先于类型Y按以下顺序:
variable先floating point先于integer
先 …
如果我想确保两个变量不实例化到同一个术语,那么首选方法是什么?
假设我需要在图中找到有向边,并且节点不能有自己的边:
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另一方面,是在图书馆,这表明它并不意味着在这种简单的情况下使用(虽然它,我似乎在寻找精确的功能).
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 = d和A = d, B = c.
| ?- sibling(a, a).
no
Run Code Online (Sandbox Code Playgroud)
我认为这意味着a …
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) 我正在尝试编写一个简单的过程来检查列表是否有任何重复.这是我到目前为止所尝试的:
% 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中编程一个家庭,我在使用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) 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)