簡體   English   中英

Prolog:從原子列表中返回事實列表

[英]Prolog: Return a list of facts from a list of atoms

我非常懷疑這是可能的,但我想知道是否有一種方法可以將原子列表轉換為事實列表。 假設兩個事實之間不會有原子的重復。

更准確地說,假設我有以下事實清單:

person(Mike, male, 33).
person(Frank, male, 24).
person(Julie, female, 25).

我想打電話

listFacts( [Mike, Frank], L).

哪個應該返回,

L = [person(Mike, male, 33), person(Frank, male, 24)].

您當前正在使用變量(以大寫字母開頭的標記)。 您必須切換到常量(在本例中為原子): Mike -> mike

之后很容易,使用setof/3

person(mike, male, 33).
person(frank, male, 24).
person(julie, female, 25).

listFacts( Names, List ) :-
   setof(person(Name,S,A), (member(Name,Names),person(Name,S,A)), List).  

這意味着:從存在事實person(Name,S,A)Names中查找Name的答案,並將相應的術語person(Name,S,A)放入名為List的集合(實際上是一個列表)中。

所以:

?- listFacts([mike,frank],F).
F = [person(frank, male, 24), person(mike, male, 33)].

存在限定的變體也有效:

listFacts( Names, List ) :-
   setof(person(Name,S,A), Name^(member(Name,Names),person(Name,S,A)), List). 

正確地,它不應該與以下內容相同:

listFacts( Names, List ) :-
   setof(person(_Name,S,A), subgoal(Names,S,A), List). 

subgoal(Names,S,A) :-
   member(Name,Names),
   person(Name,S,A).

這給我們沒有關於Name的信息:

?- listFacts([mike,frank],F).
F = [person(_6478, male, 24), person(_6492, male, 33)].

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM